我在使用jQuery的ajax函数将文件发送到服务器端PHP脚本时遇到问题。可以获取File-
List,$('#fileinput').attr('files')
但是如何将此数据发送到服务器呢?使用文件输入时$_POST
,服务器端php脚本上的结果数组()为0(NULL
)。
我知道这是可能的(尽管直到现在我还没有找到任何jQuery解决方案,只有Prototye代码(http://webreflection.blogspot.com/2009/03/safari-4-multiple-
upload-with-
progress.html
)) )。
这似乎是相对较新的,所以请不要提及通过XHR / Ajax无法上传文件,因为它确实可以正常工作。
我需要Safari 5,FF和Chrome中的功能会很好,但不是必需的。
我现在的代码是:
$.ajax({
url: 'php/upload.php',
data: $('#file').attr('files'),
cache: false,
contentType: 'multipart/form-data',
processData: false,
type: 'POST',
success: function(data){
alert(data);
}
});
从Safari 5 / Firefox 4开始,最容易使用FormData
该类:
var data = new FormData();
jQuery.each(jQuery('#file')[0].files, function(i, file) {
data.append('file-'+i, file);
});
因此,现在您有了一个FormData
对象,准备与XMLHttpRequest一起发送。
jQuery.ajax({
url: 'php/upload.php',
data: data,
cache: false,
contentType: false,
processData: false,
method: 'POST',
type: 'POST', // For jQuery < 1.9
success: function(data){
alert(data);
}
});
必须将contentType
选项设置为false
,强制jQuery不Content- Type
为您添加标题,否则,边界字符串将丢失。另外,必须将processData
标志设置为false,否则jQuery将尝试将您FormData
转换为字符串,这将失败。
您现在可以使用以下方式在PHP中检索文件:
$_FILES['file-0']
(file-0
除非您multiple
在文件输入中指定了属性,否则只有一个文件,在这种情况下,数字将随每个文件递增。)
对较旧的浏览器 使用FormData仿真
var opts = {
url: 'php/upload.php',
data: data,
cache: false,
contentType: false,
processData: false,
method: 'POST',
type: 'POST', // For jQuery < 1.9
success: function(data){
alert(data);
}
};
if(data.fake) {
// Make sure no text encoding stuff is done by xhr
opts.xhr = function() { var xhr = jQuery.ajaxSettings.xhr(); xhr.send = xhr.sendAsBinary; return xhr; }
opts.contentType = "multipart/form-data; boundary="+data.boundary;
opts.data = data.toString();
}
jQuery.ajax(opts);
从现有表单创建FormData
除了手动迭代文件,还可以使用现有表单对象的内容来创建FormData对象:
var data = new FormData(jQuery('form')[0]);
使用PHP本机数组而不是计数器
只需将文件元素命名为相同,并在方括号中加上名称即可:
jQuery.each(jQuery('#file')[0].files, function(i, file) {
data.append('file[]', file);
});
$_FILES['file']
然后将是一个数组,其中包含每个上载文件的文件上载字段。实际上,我建议在我最初的解决方案中使用此方法,因为它更容易迭代。
问题内容: 我正在开发使用不同服务其余部分的图形界面(用Java编写)。我必须调用这样的服务: 呼叫服务: 当我从Angularjs服务文件中请求时,如果服务具有Content-Type = multipart / form- data,则会收到错误400(错误请求) 如果服务的Content-Type =“ application / x-www-form-urlencoded; charset
问题内容: 我正在尝试使用Jetty将带有RestTemplate的文件上传到Raspberry Pi。在Pi上,正在运行一个servlet: 我能够成功卷曲 这是应该在webapp上具有相同功能的方法。 这是我得到的输出: ui-elements.html上传了! org.springframework.web.multipart.support.StandardMultipartHttpSer
问题内容: 我知道对此有很多疑问,但我无法解决这个问题: 我想将输入中的文件上传到multipart / form-data中的服务器 我尝试了两种方法。第一: 这导致例如图像 它应该是多部分/表单数据 和另外一个: 但这要求一个边界标头,我认为不应手动插入… 解决此问题的干净方法是什么?我读过你可以做的 但是我不希望我的所有帖子都是多部分/表单数据。默认值应为JSON 问题答案: 看一下Form
我正在尝试将带有表单数据的POST请求从React前端发送到Go后端。 在后端,我尝试通过以下方式访问数据: 但是,我收到以下错误: 此外,fileHeader是。 我发现的唯一可能的解决方案是删除这篇文章中提到的标头,但在POST正文中编码授权令牌当然不是我解决此问题的首选方法。 由于已经有人问过这个问题,我不清楚这个问题:将标题设置为 导致同样的问题。 PS:React fetch似乎会自动生
aiohttp支持功能完备的Multipart读取器和写入器。这俩都使用流式设计,以避免不必要的占用,尤其是处理的载体较大时,但这也意味着大多数I/O操作只能被执行一次。 读取Multipart响应 假设你发起了一次请求,然后想读取Multipart响应数据: async with aiohttp.request(...) as resp: pass 首先,你需要使用MultipartR
我不知道为什么不能让jQuery传递上传数据,因为AJAX对象似乎配置正确,并且发送了正确的content-type/mime-type头部。 我尝试了两种不同的请求形式--一种是将FormData对象包含在文本中,另一种是直接传递FormData对象。 不幸的是,不管怎样,我都无法传递任何内容,$_files和$_post都是空数组。