gpt4 book ai didi

javascript - jQuery.ajax模拟POST文件上传,不发送UTF-8内容

转载 作者:行者123 更新时间:2023-11-28 13:40:38 25 4
gpt4 key购买 nike

在开始之前:这是一个 100% 客户端问题。忘记服务器端语言、我如何处理上传等等——我正在将已知的工作 HTTP 文件上传请求与 jQuery 生成的 AJAX 请求进行比较,理论上应该做同样的事情。

背景:我正在为tinyMCE编写一个文件上传插件。其中一部分涉及允许支持拖放图像上传的浏览器 - 具体来说,当文件系统图像放入tinyMCE编辑器时,firefox中的tinyMCE会创建一个带有base64 src的img。这是我当前的用例,以后可能会扩展。

我的目标是获取 base64 数据并使用 jQuery 模拟表单提交以将其上传到服务器。我已经有一个正常的基于 HTML 表单的方法正在运行。

获取base64数据很简单:

$('img[src^="data:"]', ed.getDoc()).each(function(){
var data = /data:(image\/\w+);base64,(.*)/gmi.exec(this.src), format, ext;
if (data){
format = data[1];
ext = format.split('/')[1];
data = atob(data[2]);
}
else{
// blah, not supported
}
});

准备 POST 数据同样简单:

var boundary = '--------------------boundary' + (new Date).getTime();
data = '\r\n' + boundary + '\r\n' +
'Content-Disposition: form-data; name="file-upload"; filename="uploaded_image.' + ext + '"\r\n' +
'Content-Type: ' + format + '\r\n\r\n' +
data + '\r\n' +
boundary + '--'
;

剩下的就是将其发送到服务器:

$.ajax({
type: 'POST',
url: '/upload/',
contentType: 'multipart/form-data; boundary=' + boundary.slice(2),
data: data
});

服务器“正确”处理 POST(它看到文件并将其保存到磁盘),但生成的图像相当损坏 - 它不会在浏览器中显示,并且其 jpeg header完全错误,更不用说它比本地大了大约 33%(服务器上 12K vs 本地 9K)。

使用 Firebug 的 Net 选项卡,看起来没有任何问题 - 事实上,除了 Content-Type 请求 header 中额外的 charset=UTF-8 以及缺少 pretty-print 的 POST 数据之外,这AJAX 请求看起来完全类似于相应的表单 POST。使用HttpFox不过,讲述了一个不同的故事:

表单上传:

-----------------------------191891488320550623041315726177
Content-Disposition: form-data; name="file-upload"; filename="file.jpg"
Content-Type: image/jpeg

ÿØÿàJFIFHHÿÛC...

ajax上传:

--------------------boundary1375846064929
Content-Disposition: form-data; name="file-upload"; filename="file.jpeg"
Content-Type: image/jpeg

ÿÃÿà JFIFHHÿÃC...

我还注意到请求的 Content-Length 值有所不同,同样相差约 33%。所以看来,无论出于何种原因,jQuery 生成的 POST 请求实际上并没有以 UTF-8 格式发送?我错过了什么,这个拼图的最后一 block 是什么?

最佳答案

解决方案是使用 Typed Arrays和 XHR2 的 FormData (polyfills 可用于两者,但两者目前都享有重要的 native 支持)。

images.each(function(){
var image = this,
data = /data:(image\/\w+);base64,(.*)/gmi.exec(this.src),
format, ext, binary;
if (data){
format = data[1];
ext = format.split('/')[1];
binary = atob(data[2]);
data = new Uint8Array(binary.length);
for (var i=0; i<binary.length; i++)
data[i] = binary.charCodeAt(i);
}
else {
// blah, not supported
}

var fd = new FormData();
fd.append('file-upload', new Blob([data], {type: format}), 'uploaded_image.' + ext);

$.ajax({
type: 'POST',
url: '/upload/',
data: fd,
processData: false,
contentType: false
});
});

关于javascript - jQuery.ajax模拟POST文件上传,不发送UTF-8内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18094279/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com