Javascript 如何使用jQuery或其他js框架将字符串作为文件上传
使用javascript,我有一个字符串文件(通过ajax请求获得)Javascript 如何使用jQuery或其他js框架将字符串作为文件上传,javascript,jquery,ajax,upload,extjs,Javascript,Jquery,Ajax,Upload,Extjs,使用javascript,我有一个字符串文件(通过ajax请求获得) 如何通过另一个ajax请求将其作为文件上传到服务器 您需要将内容类型请求头设置为多部分/表单数据,并使用普通的Ol'JavaScript(tm)稍微调整一下格式,但您可以轻松地为库修改它: 编辑:我现在喝咖啡了,所以为jQuery修改了它(没有库版本): 下面介绍如何在不手动构建多部分请求主体的情况下执行此操作: var s = 'some string data'; var filename = 'foobar.txt';
如何通过另一个ajax请求将其作为文件上传到服务器 您需要将
内容类型
请求头设置为多部分/表单数据
,并使用普通的Ol'JavaScript(tm)稍微调整一下格式,但您可以轻松地为库修改它:
编辑:我现在喝咖啡了,所以为jQuery修改了它(没有库版本):
下面介绍如何在不手动构建多部分请求主体的情况下执行此操作:
var s = 'some string data';
var filename = 'foobar.txt';
var formData = new FormData();
formData.append('file', new File([new Blob([s])], filename));
formData.append('another-form-field', 'some value');
$.ajax({
url: '/upload',
data: formData,
processData: false,
contentType: false,
type: 'POST',
success: function () {
console.log('ok');
},
error: function () {
console.log('err'); // replace with proper error handling
}
});
使用新FormData()而不使用ajax的解决方案
str = "Hello!\nI'm text string";
var strblob = new Blob([str], {type: 'text/plain'});
var formdata = new FormData();
formdata.append("file", strblob, "file.txt");
formdata.append("field-1", "field-1-data");
var requestOptions = {
method: 'POST',
body: formdata,
redirect: 'follow'
};
fetch("http://{url}", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error))
请澄清:您是将文件路径设置为字符串,还是将文件内容设置为字符串,并希望将其作为文件上载?@Marko:这看起来像是他将文件内容设置为字符串,这是他从ajax请求中获得的。嗯,很好!我不知道在Ajax请求中这是可能的。@Pekka:当然知道。如果您无法控制要上载到的服务器,并且该服务器必须接受使用multipart/form-data发布的文本文件,则此操作非常方便。除了使用express/node进行两次调整外:1)最后一个边界需要是
+'-'+boundary+'--'
以及ajax调用中的contentType需要是:“multipart/form data;boundary=“+boundary
@chovy Rails也需要它。谢谢,你刚刚帮我省了几个小时的调试时间看起来不错。。。我可以将Base64转换为文件对象吗?如果没有,我可以使用base64并在服务器上解码它。但我只是好奇FormData对象跨浏览器兼容吗?我使用的是Dropzone,但这个答案可以将字符串转换为文件以供上传(“新文件([new Blob([s])),filename)”。为什么contentType为false?
str = "Hello!\nI'm text string";
var strblob = new Blob([str], {type: 'text/plain'});
var formdata = new FormData();
formdata.append("file", strblob, "file.txt");
formdata.append("field-1", "field-1-data");
var requestOptions = {
method: 'POST',
body: formdata,
redirect: 'follow'
};
fetch("http://{url}", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error))