0

我正在开发一个Javascript应用程序,我需要使用Mediafire REST API来上传文件。(请参阅此处上传文件)。

按照这个MDN 教程和一些研究,我已经编写了下面的代码,但似乎它不起作用......注意我暂时不需要控制进度等等,我只想做可以进行最基本的上传操作...

另请注意,我可以使用不同的代码,甚至可以使用 jQuery 或其他(免费)库,所以如果您有更好的代码来上传文件,我将不胜感激......

var controller = this;
var file = $("#file").get(0).files[0];
//The file is correctly retrieved here...

var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://www.mediafire.com/api/upload/upload.php?session_token=' + controller.sessionToken.token);
//(The session_token is valid)
xhr.overrideMimeType('text/plain; charset=x-user-defined');
xhr.setRequestHeader('x-filesize', file.size);

var reader = new FileReader();
reader.onload = function (evt) {
  var uInt8Array = new Uint8Array(evt.target.result);
  //It seems that here the ArrayBuffer is read correctly, 
  //and I converted it to a ArrayBufferView because Chrome suggested it...
  xhr.send(uInt8Array);
};
reader.readAsArrayBuffer(file);

我无法说出具体的错误,我只知道什么都没有发生......但也许看看代码你会看到一些明显的错误......我唯一看到的是在 Chrome 的控制台中:

在此处输入图像描述

在此处输入图像描述

注意:我知道这个问题的质量不是理想的,而且它太模糊了,但我尽量考虑到我对所有这些技术都是全新的......

4

1 回答 1

1

OPTIONS 请求的存在和 OPTIONS 请求中特定标头的存在表明您的 POST 请求是跨域请求。遵循CORS 规范的用户代理首先发送一个 OPTIONS 请求。这也称为预检请求,在您的情况下,由于您包含的非标准标头(x-filesize)以及 Content-Type 不是表单编码、MPE 或文本的事实,它会被发送/清楚的。您可以在服务器端处理 OPTIONS 请求,或者对您的请求进行适当的更改,以便不需要预检。无论哪种方式,您都必须在服务器端处理 CORS 请求,因为您显然是在发出跨域请求。您可以在这篇出色的 MDN 文章中阅读有关 CORS 的更多信息。

PS你为什么在这里使用FileReader?只需通过 XHR 发送 File 对象,或者更好的是,将 File 附加到 FormData 对象并发送它。

于 2013-05-03T21:30:12.610 回答