原生ajax传值php,原生ajax上传图片,php后台处理总结
原生ajax上传图片,php后台处理总结
这篇文章发布于 2018/10/03,归类于 后端数据库等
标签:
原生ajax上传图片,php后台处理图片上传
开始做图片上传,发现之前的处理方式基本忘光了。看了下原来的源码才有了解,还是要总结经验,不然忘的太快。之前是用jQuery来处理的,也是ajax方式。现在改为用原生的ajax来处理,不依赖jQuery,整体还算是比较简单的。
前端表单提交
两种方式,一种是有form元素的,一种是没form元素的
// 当input元素触发onchange事件,如果选择了图片,上传图片
function uploadImg(obj) {
// 获取文件对象,信息包括: 文件名、文件大小、文件类型
console.log(obj.files[0]);
if (!obj.files[0]) {
console.log("打开的文件,点击了取消.");
return;
}
// 传值 - 有form的情况
// var form = document.getElementsByTagName('form')[0];
// var formData = new FormData(form);
// 传值 - 没有form的情况
var formData = new FormData();
formData.append("id", "123");
formData.append("name", "test");
formData.append("editorImg", obj.files[0]);
console.log(formData);
// ajax上传文件,及表单数据
var xhr = new XMLHttpRequest();
xhr.open("post", "./server/post_info.php", false);
// 这里不用设置请求头等,默认为multipart/form-data;
xhr.send(formData);
var status = xhr.status;
if ((status >= 200 && status < 300) || status == 304) {
// xhr.responseText;
var res = JSON.parse(xhr.responseText);
// 上传图片成功后,进行后续逻辑,省略了错误处理等
var result = document.execCommand('insertImage', false, res.filePath);
if (!result) {
// 获得焦点,防止可编辑div无焦点时,无效的问题
document.getElementsByClassName("editor")[0].focus();
document.execCommand('insertImage', false, res.filePath);
}
} else {
alert(xhr.status);
}
}
后端php处理
./server/post_info.php 处理逻辑如下
header("Content-type:application/json;charset=utf-8");
# 添加响应头,防止中文乱码
$result = move_uploaded_file($_FILES['editorImg']['tmp_name'],"../uploads/".$_FILES["editorImg"]["name"]);
// echo "result".$k."result";
if ($result) {
echo json_encode(array(
"error_code" => 0,
"error_msg" => "上传成功",
"filePath" => "./uploads/".$_FILES["editorImg"]["name"]
));
} else {
echo json_encode(array(
"error_code" => -1,
"error_msg" => "上传失败",
"filePath" => "./uploads/".$_FILES["editorImg"]["name"]
));
}
遇到的问题及处理过程
乍一看,so easy,但功能跑通纠结了好一会儿
问题一 后端接收不到传值,乱码问题
以下三种都试了,除了不设置直接用系统的,以下三个请求头都会导致后台php获取文件数据异常
xhr.setRequestHeader("Content-type","text/plain;charset=UTF-8");
xhr.setRequestHeader("Content-type","multipart/form-data;charset=UTF-8");
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8");
乱码的情况,添加了请求头没反应, header("Content-type:application/json;charset=utf-8");
后来又突然好了,可能是我直接在apache上面跑的,有缓存。
问题二 文件保存失败, 无任何错误提示
最开始move_uploaded_file函数执行一点反应的没有,看了文档会返回 true or false,后来我测试,每次返回的是空字符串,也就是 "",而且还不报任何错误。于是把前段时间弄文件上传的demo拿出来跑了跑居然是可以的,对比了下,发现应该是目录权限的问题,upload默认权限为 744(drwxr--r--),一般用户没有写的权限,于是改成了777(drwxrwxrwx)的权限,然后就成功了。发现move_uploaded_file函数执行成功返回1。也就是这个函数返回""或"1",如果说返回 true / false 也行,但有误导的意思。定位不到错误时,让人怀疑人生。
chmod 777 upload
然后我就郁闷了,怎么让move_uploaded_file这个函数在遇到问题时报错。由于没有用任何框架,直接将php放到apache的根目录直接跑项目,重新看了下php错误处理,搜了对应的内容。发现php默认提示错误居然是关闭的。举个最简单的例子,下面是页面1.php的代码,直接运行会显示空白页,什么都没有,但test是未定义的,且x=4明显语法错误都没提示。
x=4;
echo $test;
?>
有两种方法可以让系统提示错误
自己捕获错误,加入如下代码,出现上面test未定义的情况,会提示错误,而非空白页,但x=4的语法错误还是不会提示。<?php
function customError($errno, $errstr)
{
echo "Error: [$errno] $errstr
";
echo "脚本结束";
die();
}
set_error_handler("customError");
x=4;
echo $test;
?>
将系统的错误提示打开,都会有提示
php.ini配置文件里面 display_errors = Off 默认设置是关闭的,改为On后重启apache服务即可生效。display_errors = On
原生ajax传值php,原生ajax上传图片,php后台处理总结相关推荐
- eazyui ajax传值,jquery easyui ajax data属性传值方式
$.ajax({ url:url, type:'post', data:data, dataType:'json', contentType: "application/x-www-form ...
- php ajax传值报错,ajax传值报错之php5.5、5.6关于ajax的传值要求
在工作中,使用ajax的时候,出现了一种莫名其妙的情况.两台服务器都是正常运行的,但是在使用ajax的时候,发现在其中一台服务器运行完全没有问题的代码,迁移到另外一台服务器的时候,无法正常工作,经过不 ...
- java获取ajax传值,java取ajax传值
java取ajax传值 [2021-02-03 11:32:37] 简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace("/(\ ...
- jquery ajax传值php,jquery ajax传值问题
string(1) "志愿1" success: function(data) { alert(data); } 传过去值了吧,可是在后台只能取到选择的ID值,无法获取表单里的轮次 ...
- .ajax get 写法,原生Ajax写法(GET)
ajax的GET提交方式的原生代码: var xhr = null; if(window.XMLHttpRequest){ xhr = new XMLHttpRequest(); }else if(w ...
- 原生及jq方式使用ajax
1.原生js实现Ajax方法: var Ajax={get: function (url,fn){var obj=new XMLHttpRequest(); // XMLHttpRequest对象用于 ...
- AJAX初识(原生JS版AJAX和Jquery版AJAX)
一.什么是JSON 1.介绍JSON独立于语言,是一种与语言无关的数据格式.JSON指的是JavaScript对象表示法(JavaScript Object Notation)JSON是轻量级的文本数 ...
- JS原生Ajax和jQuery的Ajax与代码示例
JS原生Ajax和jQuery的Ajax [学习目标] 1,了解JS原生Ajax原理 2,掌握json数据格式 掌握json数据格式方式 掌握json的解析方式 3,掌握jQuery中的Ajax封装 ...
- 原生ajax和Jquery的ajax
目录 原生ajax 传统请求(同步方式)的问题 Ajax优势和作用 Ajax请求与传统请求的区别: ajax原理(方法,属性 ) XMLHttpRequest open send 属性 readySt ...
最新文章
- python教学案例-Python机器学习经典实例
- Python 函数(可变参数)
- Linux内核源代码分析——swap实现
- Linux串口工具ckermit打印 android log
- WPF如何得到一个在用户控件内部的元素的坐标位置
- Install Air Conditioning HDU - 4756(最小生成树+树形dp)
- Nodejs设备接入阿里云IoT平台
- 拆解洪恩教育2020年财报:Q4亏损扩大7倍,负债增至4亿元
- Unity-VR | AR相关(更新中)
- 科学数学工程工具MATLAB软件2023a中文版下载安装,MATLAB特色
- 读书笔记-《像高手一样发言》
- CRM后台管理系统:HTML+CSS+JavaScript制作企业网站后台管理系统模板网站(46个页面)
- FFmpeg:截取视频片段转成GIF动画
- LaTeX - 星形线(内摆线的一种)
- Java工程中的综合排序算法选取
- 赛尔号星球大战服务器维修,《赛尔号星球大战》12月21日停服更新公告
- 数据探索(数据清洗)①—数据质量分析(对数据中的缺失值、异常值和一致性进行分析)
- 2022阿里云峰会·广东
- su oracle 和 su - oracle的区别
- js解码出数据库密钥