我正在尝试使用 JavaScript 中的本机 FileAPI 构建文件上传器,我想通过 XMLHttpRequest(不带 jQuery)将文件上传到使用 Express.js 的 Node.js 服务器.
I'm trying to build a file uploader with the native FileAPI in JavaScript and I want to upload the files via XMLHttpRequest (without jQuery) to a Node.js server, which uses Express.js.
文件读取部分工作正常,当我上传没有 XMLHttpRequest 的文件时,它工作得很好(文件在 Express.js 的 req.files 中).
The file reading part works fine and when I upload the file without the XMLHttpRequest it works perfectly (the files are in req.files in Express.js).
问题是通过 AJAX 上传:req.files 始终为空.
The problem is the upload via AJAX: req.files is always empty.
这里有一些代码:
形式:
<form action="http://localhost:3000/upload" method="POST" enctype="multipart/form-data" name="form">
<input type="file" name="uploads" id="files" multiple="multiple">
<input type="submit" name="submit" value="submit">
</form>
前端的上传部分(在 files[0].data 中是一个文件 - 不是数组或其他东西):
The upload part in the frontend (in files[0].data is a file - not an array or something):
function uploadFiles(files) {
var xhr = new XMLHttpRequest();
xhr.submittedData = files; // Array of objects with files included. But it neither works with an array of files nor just one file
xhr.onload = successfullyUploaded;
xhr.open("POST", "http://localhost:3000/upload", true);
xhr.setRequestHeader('X-Requested-With','XMLHttpRequest');
xhr.send();
}
出现问题的后端:
exports.receiveUpload = function(req, res){
console.log(req.files); // empty
var files = req.files.uploads; // always empty with AJAX upload. with normal upload it's fine
console.log(req.xhr); // true
// ...
}
这里有一些 Express.js 配置(在没有 AJAX 的情况下我已经遇到了同样的错误 - 在代码的注释中,您可以看到解决了没有 AJAX 上传问题的行和 Stack Overflow 帖子):
And here's some Express.js config (I already had the same error without AJAX - in the comments in the code you can see the lines and the Stack Overflow post that solved it for the upload without AJAX):
// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
// this 3 lines have to be before app.use(app.router)
// https://stackoverflow.com/questions/21877098/upload-file-using-express-failed-cannot-read-property-of-undefined
app.use(express.multipart());
app.use(express.bodyParser({ keepExtensions: true, uploadDir: path.join(__dirname, 'public', 'uploads') }));
app.use(express.methodOverride());
app.use(app.router);
app.use(require('less-middleware')(path.join(__dirname, '/public')));
app.use(express.static(path.join(__dirname, 'public')));
提前致谢!
问候,
C.
感谢@Pengtuzi 我解决了:
Thx to @Pengtuzi I solved it:
我使用 FormData API 上传文件.我的错误是我认为错误会发生在服务器上.
I used the FormData API to upload the files. My mistake was that I thought the error would happen on the server.
这是为我解决它的代码:
Here's the code that solved it for me:
function uploadFiles(files) {
var xhr = new XMLHttpRequest();
var formData = new FormData();
xhr.onload = successfullyUploaded;
xhr.open("POST", "http://localhost:3000/upload", true);
xhr.setRequestHeader('X-Requested-With','XMLHttpRequest');
for(var file in files) {
formData.append("uploads", files[file].data);
}
xhr.send(formData);
}
这篇关于使用 XMLHttpRequest 将多个文件上传到 Express.js 3.5 服务器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!
即使在调用 abort (jQuery) 之后,浏览器也会等待Browser waits for ajax call to complete even after abort has been called (jQuery)(即使在调用 abort (jQuery) 之后,浏览器也会等待 ajax 调用
JavaScript innerHTML 不适用于 IE?JavaScript innerHTML is not working for IE?(JavaScript innerHTML 不适用于 IE?)
XMLHttpRequest 无法加载,请求的资源上不存在“AXMLHttpRequest cannot load, No #39;Access-Control-Allow-Origin#39; header is present on the requested resource(XMLHttpRequest 无法加载,请求的资
XHR HEAD 请求是否有可能不遵循重定向 (301 302)Is it possible for XHR HEAD requests to not follow redirects (301 302)(XHR HEAD 请求是否有可能不遵循重定向 (301 302))
XMLHttpRequest 206 部分内容XMLHttpRequest 206 Partial Content(XMLHttpRequest 206 部分内容)
XMLHttpRequest 的 getResponseHeader() 的限制?Restrictions of XMLHttpRequest#39;s getResponseHeader()?(XMLHttpRequest 的 getResponseHeader() 的限制?)