Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >XMLHttpRequest()没有发送FormData(),导致$_FILES数组空,也没有上传文件

XMLHttpRequest()没有发送FormData(),导致$_FILES数组空,也没有上传文件
EN

Stack Overflow用户
提问于 2019-02-28 04:13:43
回答 1查看 1.5K关注 0票数 2

我想做的事:

本质上,我试图将一个文件上传到服务器上的一个目录中,用户通过一个HTML元素上传该目录。

为此,我在<input>元素的change事件上创建一个新的change,它应该将上传文件的数据发送到upload.php文件,然后upload.php文件处理上传的文件并将其异步上传到服务器。

我的代码:

HTML

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<form class="js-upload-form" method="POST" action="upload.php" enctype="multipart/form-data">
    <input class="button js-uploaded-file" type="file" name="file" />
</form>

JS

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
document.querySelector('.js-uploaded-file').addEventListener('change', function() {

    let file = this.files[0];
    let formData = new FormData();

    formData.append('file', file);

    let xhr = new XMLHttpRequest();
    xhr.open('POST', 'upload.php', true);

    xhr.setRequestHeader('Content-type', 'multipart/form-data');

    xhr.upload.onprogress = function(e) {

        if (e.lengthComputable) {

            let percentComplete = (e.loaded / e.total) * 100;
            console.log(percentComplete + '% uploaded');

        }
    };

    xhr.onload = function() {

        if (this.status == 200) {

            console.info(this.response);

        }
    };

    xhr.send(formData);

}, false);

PHP (upload.php)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print_r($_FILES);

$currentDir = getcwd();
$uploadDirectory = "/uploads/";

$errors = []; // Store all foreseen and unforseen errors here

$fileName = preg_replace("/[^A-Z0-9._-]/i", "_", $_FILES['file']['name']);
$fileSize = $_FILES['file']['size'];
$fileTmpName = $_FILES['file']['tmp_name'];
$fileType = $_FILES['file']['type'];

$uploadPath = $currentDir . $uploadDirectory . $fileName;

if ($fileSize > 2000000) {
    $errors[] = "This file is more than 2MB. Sorry, it has to be less than or equal to 2MB";
}

if (empty($errors)) {
    $didUpload = move_uploaded_file($fileTmpName, $uploadPath);

    if ($didUpload) {
        echo "The file " . basename($fileName) . " has been uploaded";
    } else {
        echo "An error occurred somewhere. Try again or contact the admin";
    }
} else {
    foreach ($errors as $error) {
        echo $error . "These are the errors" . "\n";
    }
}

我的问题

这段代码根本不起作用。打印$_FILES数组返回一个空数组,控制台记录xhr.response中的错误信息(“某个错误发生在某个地方。请再试一次或联系管理员”)。我真的很感激在解决这个问题上的任何帮助,因为我已经浏览了无数其他关于这个问题的在线资源,尽管我觉得我的代码完全按照他们说的做,但它仍然不起作用。

我尝试过的:

我尝试简单地提交表单,而不是通过添加一个submit按钮来尝试使用FormData()对象和<input> change事件提交表单,尽管页面重定向到.url/upad.php并且没有异步工作,但是$_FILES数组包含上传文件的正确数据,并且文件被上传到服务器,这让我认为我的Javascript代码中肯定有问题,要么与XMLHttpRequest有关,要么涉及FormData对象。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-28 04:59:30

通常,XMLHttpRequest将从FormData对象生成适当的内容类型。

但是,您正在使用手动创建的一个覆盖它:

Xhr.setRequestHeader(“内容类型”、“多部分/表单-数据”);

但是,缺少强制的boundary属性,因此PHP无法找到将请求的各个部分拆分的点。

不要覆盖内容类型.删除引用的行。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54925494

复制
相关文章
ajax文件上传-FormData()
HTML: 1 <form action=""> 2 3 <input type="file" id="file1" name=""> 4 5 <br> 6 7 <input type="file" id="file2" name=""> 8 9 <br> 10 11 <input type="button" value="保存"> 12 13
ProsperLee
2018/10/24
5.1K0
ajax文件上传-FormData()
XMLHttpRequest2-FormData上传文件方法封装及进度条的实现
版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/article/details/51240496
空空云
2018/09/27
1.1K0
玩转图片上传————原生js XMLHttpRequest 结合FormData对象实现的图片上传
  服务端如何处理的解决方案看我的这篇文章http://www.cnblogs.com/theone67/p/6698762.html
Theone67
2019/11/21
8.3K0
Django上传文件时,request.FILES为空的问题
用html的form上传文件时,request.FILES为空,没有收到上传来的文件,但是在request.POST里找到了上传的文件名(只是一个字符串)。
kirin
2020/11/13
1.7K0
vue 使用 axios 上传文件 — FormData
在此主要介绍 如何使用 formData 对象上传单文件和多文件,FormData 就是 XMLHttpRequest Level 2 新增的一个对象,利用它来提交表单、模拟表单提交,当然最大的优势就是可以上传二进制文件。
全栈程序员站长
2022/09/07
3.1K0
FormData对象的应用
XMLHttpRequest 是一个浏览器接口,通过它,我们可以使得 Javascript 进行 HTTP (S) 通信。XMLHttpRequest 在现在浏览器中是一种常用的前后台交互数据的方式。2008年 2 月,XMLHttpRequest Level 2 草案提出来了,相对于上一代,它有一些新的特性,其中 FormData 就是 XMLHttpRequest Level 2 新增的一个对象,利用它来提交表单、模拟表单提交,当然最大的优势就是可以上传二进制文件。
OECOM
2020/07/02
1.7K0
写给新手前端的各种文件上传攻略,从小图片到大文件断点续传
今年国庆假期终于可以憋在家里了不用出门了,不用出去看后脑了,真的是一种享受。这么好的光阴怎么浪费,睡觉、吃饭、打豆豆这怎么可能(耍多了也烦),完全不符合我们程序员的作风,赶紧起来把文章写完。
coder_koala
2019/11/04
3.2K0
写给新手前端的各种文件上传攻略,从小图片到大文件断点续传
文件上传那些事儿
导语 作为一枚初入鹅厂的鲜鹅,对这里的一切都充满着求知欲。看到我们的KM平台如此生机勃勃,各种技术分享交流如火如荼,在努力的汲取着养分的同时也期待自己能为这个生态圈做出贡献。正好新人导师让我看看能否把
谭伟华
2017/05/04
10.7K5
文件上传的动作不能太俗,必须页面无刷新上传
常规操作上传文件 1 <form action="xxx.action" method="post" enctype="multipart/form-data"> 2 <input type=
赵小忠
2018/01/24
1.7K0
前端本地文件操作与上传
前端无法像原生APP一样直接操作本地文件,否则的话打开个网页就能把用户电脑上的文件偷光了,所以需要通过用户触发,用户可通过以下三种方式操作触发:
IT派
2018/08/10
1.6K0
前端本地文件操作与上传
XMLHttpRequest Level 2 使用指南
XMLHttpRequest是一个浏览器接口,使得Javascript可以进行HTTP(S)通信。 最早,微软在IE 5引进了这个接口。因为它太有用,其他浏览器也模仿部署了,ajax操作因此得以诞生。 但是,这个接口一直没有标准化,每家浏览器的实现或多或少有点不同。HTML 5的概念形成后,W3C开始考虑标准化这个接口。2008年2月,就提出了XMLHttpRequest Level 2 草案。 这个XMLHttpRequest的新版本,提出了很多有用的新功能,将大大推动互联网革新。本文就对这个新版本进行详
ruanyf
2018/04/12
1.1K0
XMLHttpRequest Level 2 使用指南
居于H5的多文件、大文件、多线程上传解决方案
文件上传在web应用中是比较常见的功能,前段时间做了一个多文件、大文件、多线程文件上传的功能,使用效果还不错,总结分享下。 一、 功能性需求与非功能性需求 要求操作便利,一次选择多个文件进行上传; 支持大文件上传(1G),同时需要保证上传期间用户电脑不出现卡死等体验; 交互友好,能够及时反馈上传的进度; 服务端的安全性,不因上传文件功能导致JVM内存溢出影响其他功能使用; 最大限度利用网络上行带宽,提高上传速度; 二、 设计分析 对于大文件的处理,无论是用户端还是服务端,如果一次性进行读取发送、接收都是不
李海彬
2018/03/27
3.3K0
居于H5的多文件、大文件、多线程上传解决方案
《大胖 • 小课》- 说说大文件分片和断点续传
这是《大胖小课》栏目的专题一《说说文件上传那些事儿》的第6节-《大文件分片和断点续传》。
zz_jesse
2020/03/17
1.3K0
【原生Ajax】全面了解xhr的概念与使用。
xhr是浏览器提供的JavaScript对象,通过它,可以请求服务器上的数据资源,之前所学的jquery的ajax函数,就是基于xhr对象封装出来的。
坚毅的小解同志的前端社区
2022/11/28
2.6K0
【原生Ajax】全面了解xhr的概念与使用。
使用FormData对象添加字段方式上传文件
<input type="file" id="file"> var formData = new FormData(); formData.append('file',$('#file')[0].files[0]); $.ajax({     url: '',     type: 'POST',     cache: false,     data: formData,     processData: false,     contentType: false }).done(function(res) { }).fail(function(res) {});
双面人
2019/06/13
2.2K0
字节面试官:请你实现一个大文件上传和断点续传
原 作 者:yeyan1996原文链接:https://url.cn/5h66afn
Nealyang
2020/02/19
2.9K0
js文件上传的几种方式_java执行js文件
工作中用到了Ajax上传文件的情景 之前自己不知道ajax可以传 通过文档发现XHR2.0已经支持了 但需要集合FormData
全栈程序员站长
2022/11/17
10.4K0
Java 单文件、多文件上传 / 实现上传进度条
实现:单文件上传、多文件上传(单选和多选),并且用 ajax 异步刷新,在当前界面显示上传的文件
Krry
2019/08/13
7K0
前端处理图片上传的几种方式
在用html5实现图片预览功能这篇文章中只是介绍了图片上传过程中预览的实现,那关于图片上传有哪几种方式呢?
挥刀北上
2019/08/06
5.2K0
点击加载更多

相似问题

javascript使用FormData时出现上传问题,导致$_FILES空

11

PHP FormData XMLHttpRequest $_FILES空,但$_POST提供原始完整文件编码。

11

文件上传:$_FILES数组为空

10

文件上传$_FILES数组为空

22

如何使用FormData和XmlHTTPRequest上传文件?

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文