原生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后台处理总结相关推荐

  1. eazyui ajax传值,jquery easyui ajax data属性传值方式

    $.ajax({ url:url, type:'post', data:data, dataType:'json', contentType: "application/x-www-form ...

  2. php ajax传值报错,ajax传值报错之php5.5、5.6关于ajax的传值要求

    在工作中,使用ajax的时候,出现了一种莫名其妙的情况.两台服务器都是正常运行的,但是在使用ajax的时候,发现在其中一台服务器运行完全没有问题的代码,迁移到另外一台服务器的时候,无法正常工作,经过不 ...

  3. java获取ajax传值,java取ajax传值

    java取ajax传值 [2021-02-03 11:32:37]  简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace("/(\ ...

  4. jquery ajax传值php,jquery ajax传值问题

    string(1) "志愿1" success: function(data) { alert(data); } 传过去值了吧,可是在后台只能取到选择的ID值,无法获取表单里的轮次 ...

  5. .ajax get 写法,原生Ajax写法(GET)

    ajax的GET提交方式的原生代码: var xhr = null; if(window.XMLHttpRequest){ xhr = new XMLHttpRequest(); }else if(w ...

  6. 原生及jq方式使用ajax

    1.原生js实现Ajax方法: var Ajax={get: function (url,fn){var obj=new XMLHttpRequest(); // XMLHttpRequest对象用于 ...

  7. AJAX初识(原生JS版AJAX和Jquery版AJAX)

    一.什么是JSON 1.介绍JSON独立于语言,是一种与语言无关的数据格式.JSON指的是JavaScript对象表示法(JavaScript Object Notation)JSON是轻量级的文本数 ...

  8. JS原生Ajax和jQuery的Ajax与代码示例

    JS原生Ajax和jQuery的Ajax [学习目标] 1,了解JS原生Ajax原理 2,掌握json数据格式 掌握json数据格式方式 掌握json的解析方式 3,掌握jQuery中的Ajax封装 ...

  9. 原生ajax和Jquery的ajax

    目录 原生ajax 传统请求(同步方式)的问题 Ajax优势和作用 Ajax请求与传统请求的区别: ajax原理(方法,属性 ) XMLHttpRequest open send 属性 readySt ...

最新文章

  1. python教学案例-Python机器学习经典实例
  2. Python 函数(可变参数)
  3. Linux内核源代码分析——swap实现
  4. Linux串口工具ckermit打印 android log
  5. WPF如何得到一个在用户控件内部的元素的坐标位置
  6. Install Air Conditioning HDU - 4756(最小生成树+树形dp)
  7. Nodejs设备接入阿里云IoT平台
  8. 拆解洪恩教育2020年财报:Q4亏损扩大7倍,负债增至4亿元
  9. Unity-VR | AR相关(更新中)
  10. 科学数学工程工具MATLAB软件2023a中文版下载安装,MATLAB特色
  11. 读书笔记-《像高手一样发言》
  12. CRM后台管理系统:HTML+CSS+JavaScript制作企业网站后台管理系统模板网站(46个页面)
  13. FFmpeg:截取视频片段转成GIF动画
  14. LaTeX - 星形线(内摆线的一种)
  15. Java工程中的综合排序算法选取
  16. 赛尔号星球大战服务器维修,《赛尔号星球大战》12月21日停服更新公告
  17. 数据探索(数据清洗)①—数据质量分析(对数据中的缺失值、异常值和一致性进行分析)
  18. 2022阿里云峰会·广东
  19. su oracle 和 su - oracle的区别
  20. js解码出数据库密钥

热门文章

  1. 逻辑思维强的人适合学计算机不,逻辑思维强的人适合做什么工作?
  2. jmeter调试取样器
  3. ssim算法计算图片_图像质量评估算法 SSIM(结构相似性)
  4. MySQL 聚集索引(InnoDB)和 非聚集索引(MyISAM) 精讲~两张图彻底搞懂
  5. firefox手动设置火狐浏览器的默认主页
  6. vue3.x 使用jsplumb进行拖拽连线
  7. 华为云618年中钜惠,服务器免费领三个月
  8. 大数据风控AI竞赛总结
  9. python删除重复文件代码
  10. 经典练习项目门级的三个案列