【问题标题】:Uploading Files with Ajax working on Postman but not browser使用 Ajax 上传文件在 Postman 但不是浏览器
【发布时间】:2019-06-02 10:27:45
【问题描述】:

我试图让某些用户使用 Ajax 将视频上传到 API。这适用于 Postman,但是从浏览器执行此操作时,我收到 500 内部服务器错误。

我无权访问服务器,因此无法显示服务器日志,但据此人说,他收到了“OPTIONS”帖子,但没有收到带有multipart/form-data 的第二个帖子。当我在 chrome 网络工具中检查我的表单数据时,它给了我this

我为每次上传附加的 url 看起来像 this

The two requests in the network tool.

我的表单的发布方式似乎有问题,我很确定这是我的错,而不是服务器的错,因为它与 Postman 一起使用。

邮递员代码是:

var form = new FormData();
form.append("video", "C:\\Users\\Sidhant\\Downloads\\examplevid.mp4");

var settings = {
  "async": true,
  "crossDomain": true,
  "url": "https://apiurl/catagoryid/videotitle",
  "method": "POST",
  "headers": {
    "Authorization": "Bearer token",
    "Content-Type": "application/x-www-form-urlencoded",
    "cache-control": "no-cache",
    "Postman-Token": "token"
  },
  "processData": false,
  "contentType": false,
  "mimeType": "multipart/form-data",
  "data": form
}

$.ajax(settings).done(function (response) {
  console.log(response);
});

除了获取文件的方式之外,我的代码是相同的:

var fileinput = document.getElementById("fileinput").files[0];
var form = new FormData($('#fileinput')[0]);

使用 postman 时,视频会添加到 API,而通过浏览器会出现 500 错误。我怎样才能停止收到这个错误,我可以尝试什么。我是 Ajax 的初学者,所以我不熟悉这类问题。

【问题讨论】:

  • 什么是 [Object% in your Url?您可能希望将文本框文本附加到 URL 而不是对象本身。

标签: javascript jquery ajax postman


【解决方案1】:

问题 1

var fileinput = document.getElementById("fileinput").files[0];
var form = new FormData($('#fileinput')[0]);

如果你用一个值初始化FormData,它应该是一个表单元素

如果要添加文件,需要先创建对象,然后追加文件。

无论哪种方式,您都不应该获取文件然后将其传递给 jQuery。这根本没有意义。 jQuery 适用于 HTML、选择器和 DOM 元素,而不是文件对象。

要么:

var form = document.getElementById("fileinput").form;
var data = new FormData(form);

var file = document.getElementById("fileinput").files[0];
var data = new FormData();
data.append("video", file, "filename.mp4");

问题 2

您正在覆盖请求的 Content-Type,因此它不会从 FormData 对象生成正确的内容,并且服务器将不知道如何提取数据。

删除

"Content-Type": "application/x-www-form-urlencoded",

"mimeType": "multipart/form-data",

旁白

"async": true,

这是默认设置。明确设置是没有意义的。

"crossDomain": true,

这没有任何作用,除非您发出同源请求,该请求被重定向为跨源。设置它通常没有意义。

【讨论】:

  • 感谢您的回复。我看到我是如何搞砸 jQuery 元素选择的。修复了那个问题。但是,我尝试了您的第二个建议,但它导致呼叫失败。我不知道为什么,可能对 API/服务器的设置方式有些奇怪,但更改任何选项,如内容类型、mimeType,无论组合如何,都会出现 500 错误。
【解决方案2】:

问题在于您如何选择表单数据中的文件。

var fileinput = document.getElementById("fileinput").files[0];
var form = new FormData($('#fileinput')[0]);

您使用纯 js 正确选择文件,然后使用 Jquery 并简单地选择文件输入元素。所以这就像你试图附加 html 元素本身,而不是用户数据。

使用这个。

//null check on the input 
var fileinput = $('#fileinput').length ? $('#fileinput')[0].files[0] : null;
//Create the FormData and add the file to the FD
var form = new FormData();
form.append('video', fileinput );

【讨论】:

  • 已解决问题,谢谢!我知道我误解了您和另一位发帖人指出的文件选择。不幸的是,现在我遇到了 413: payload too large 问题,这可能是服务器端的错误。再次感谢。
猜你喜欢
  • 2020-11-19
  • 1970-01-01
  • 2011-01-07
  • 1970-01-01
  • 2018-03-25
  • 2022-01-17
  • 2011-11-19
  • 2017-10-12
  • 2021-09-18
相关资源
最近更新 更多