使用标头身份验证上传跨域文件

时间:2012-11-02 17:17:29

标签: javascript html file-upload cross-domain

我需要从浏览器中的客户端将文件上传到第三方,我需要在标头中发送api令牌。我需要新旧浏览器的通用解决方案。

这就是卷曲的样子

curl -v -H "X-LLNW-Authorization: $TOKEN" \
-F uploadFile=@/tmp/wobble.txt \
-F directory=/testpost \
-F basename=wobble-004.txt https://api.lama.lldns.net/post/file

basename并不重要。

我相信我只限于javascript可以让我在这里做什么。我无法访问服务器。

可以这样做吗?

感谢。

2 个答案:

答案 0 :(得分:2)

编辑:如果您有自定义标头,则跨域请求将无效。如果您有自定义标头,则会自动发送OPTIONS请求,服务器必须以200 OK回复该请求,然后发送实际的POST。 由于您必须使用自定义标头进行身份验证,因此您必须更改服务器端以接受OPTIONS请求。我怀疑你运气不好。

下面是没有自定义标头的情况的代码,其中跨域请求有效: 使用类似于此的HTML:

<form >
  <input type="file" name="file" id="fileToUpload" onchange="uploadFile()">
</form>

使用此代码

function uploadFile() {
  var fd = new FormData();
  fd.append("fileToUpload", document.getElementById('fileToUpload').files[0]);
  fd.append("directory","/testpost");
  fd.append("basename","wobble-004.txt");

  var oReq = new XMLHttpRequest();
  oReq.open("POST", "https://api.lama.lldns.net/post/file", true);
  oReq.onreadystatechange = alert(status);
  oReq.send(fd);
}

有关详细信息,请参阅this Mozilla blog post

答案 1 :(得分:0)

对于带有CORS的CSS,您需要从选项预检请求中返回一个标题,该标题会包含要发送的已接受标题列表,可以是任意标题,但浏览器只会发送该列表中包含的自定义标题。 浏览器只会遵循返回标头中指示的OPTIONS。 检查CORS OPTIONS响应标准。