如何解决 746: 在 AJAX post formData 中的意外标记
how to solve 746: unexpected token at ' in an AJAX post formData
我正在通过 AJAX 向 Ruby 发送文件对象,如下所示:
var files = $("#upDOCS").prop('files'),
formData = new FormData();
for (var i = 0; i < files.length; i++) {
var file = files[i];
if (!file.type==='application/pdf') {
continue;
}
formData.append(file.name, file);
}
$.ajax({
xhr: function () {
var xhr = $.ajaxSettings.xhr();
xhr.upload.onprogress = function (e) {
console.log(Math.floor(e.loaded / e.total * 100) + '%');
};
return xhr;
},
url: "medcon/adddocs",
type: "POST",
enctype: 'multipart/form-data',
data: formData,
cache: false,
contentType: false,
processData: false,
success: function (locks) { ...
但我收到一条错误消息,提示我正在发送一个以破折号开头的意外令牌 -----
在我看来,我得到了 pdf 文件对象,因为错误还包括 PDF 数据:
746: unexpected token at '------WebKitFormBoundarybp8j3mTAsTL4JrAq
Content-Disposition: form-data; name="test.pdf"; filename="test.pdf"
Content-Type: application/pdf
%PDF-1.4
%����
1 0 obj
<</Creator (Mozilla/5.0 \(Windows NT 10.0; Win64; x64\) AppleWebKit/537.36 \(KHTML, like Gecko\) Chrome/70.0.3538.110 Safari/537.36)
/Producer (Skia/PDF m70)
/CreationDate (D:20181130205113+00'00')
/ModDate (D:20181130205113+00'00')>>
endobj
2 0 obj
<</Type /XObject
/Subtype /Image
/Width 17
/Height 17
/ColorSpace /DeviceRGB
/SMask 3 0 R
/BitsPerComponent 8
/Filter /FlateDecode
/Length 144>> stream
x���I� ��S�7�M�'9eʈ���'�i3�1�d;��ӫ��9�;�h��X�����8��uV�p����b�?���4ӵ�/����0䵍�����Z+?P���(C���@gjޏ~�f������?v��N
endstream
endobj
3 0 obj
<</Type /XObject
/Subtype /Image
/Width 17
/Height 17
/ColorSpace /DeviceGray
/BitsPerComponent 8
/Filter /FlateDecode
/Length 121>> stream
x�c`'
我哪里错了?我引入了什么非法令牌或我遗漏了什么格式?
我发现我们不需要整个表单对象来将文件上传到服务器。我们只需要 base64 字符。为了获得这些,我必须使用 onload 事件,这意味着 AJAX 必须是同步的而不是异步的;也就是说,AJAX 必须在 onload 事件触发器内。这对我有用:
function _docs_submit() {
event.preventDefault();
upDOCS_btn.html("Uploading...");
var fileReader = new FileReader(),
base64;
// Define file reader function to read the file content and convert to base64
fileReader.onload = function(file) {
base64 = file.target.result;
data["file_base64"] = base64.split(/,/)[1];
/* Ajax - has to go in the onload event because this has to be synchronous*/
$.ajax({
xhr: function () {
var xhr = $.ajaxSettings.xhr();
xhr.upload.onprogress = function (e) {
console.log(Math.floor(e.loaded / e.total * 100) + '%');
};
return xhr;
},
url: "medcon/adddocs",
type: "POST",
enctype: 'multipart/form-data',
dataType: "json",
data: JSON.stringify(data),
cache: false,
contentType: false,
processData: false,
success: function (locks) {
alert('Thank you.\nDocument(s) received.');
//$('#gscForm')[0].reset();
self.element.remove();
$("#medcon-3").empty();
$("#medcon-3").append($('<div id="medcon">').medconlist());
$("#medcon-2").empty();
$("#medcon-2").append($('<div id="medcon">').medcon());
$("#medcon-1").empty();
//$("#medcon-1").append($('<div id="medconoverview">').medcongsc());
$("#medcons").tabs('select', '#medcon-1');
},
error: function(e) {
alert("There was an error submitting your documents:\n" + e.responseText);
console.log(e.responseText);
}
});
};
var file = $("#upDOCS").prop('files')[0],
data = {
"filename":file.name,
"filetype":file.type,
"filesize":file.size
}
fileReader.readAsDataURL(file);
}
我正在通过 AJAX 向 Ruby 发送文件对象,如下所示:
var files = $("#upDOCS").prop('files'),
formData = new FormData();
for (var i = 0; i < files.length; i++) {
var file = files[i];
if (!file.type==='application/pdf') {
continue;
}
formData.append(file.name, file);
}
$.ajax({
xhr: function () {
var xhr = $.ajaxSettings.xhr();
xhr.upload.onprogress = function (e) {
console.log(Math.floor(e.loaded / e.total * 100) + '%');
};
return xhr;
},
url: "medcon/adddocs",
type: "POST",
enctype: 'multipart/form-data',
data: formData,
cache: false,
contentType: false,
processData: false,
success: function (locks) { ...
但我收到一条错误消息,提示我正在发送一个以破折号开头的意外令牌 ----- 在我看来,我得到了 pdf 文件对象,因为错误还包括 PDF 数据:
746: unexpected token at '------WebKitFormBoundarybp8j3mTAsTL4JrAq
Content-Disposition: form-data; name="test.pdf"; filename="test.pdf"
Content-Type: application/pdf
%PDF-1.4
%����
1 0 obj
<</Creator (Mozilla/5.0 \(Windows NT 10.0; Win64; x64\) AppleWebKit/537.36 \(KHTML, like Gecko\) Chrome/70.0.3538.110 Safari/537.36)
/Producer (Skia/PDF m70)
/CreationDate (D:20181130205113+00'00')
/ModDate (D:20181130205113+00'00')>>
endobj
2 0 obj
<</Type /XObject
/Subtype /Image
/Width 17
/Height 17
/ColorSpace /DeviceRGB
/SMask 3 0 R
/BitsPerComponent 8
/Filter /FlateDecode
/Length 144>> stream
x���I� ��S�7�M�'9eʈ���'�i3�1�d;��ӫ��9�;�h��X�����8��uV�p����b�?���4ӵ�/����0䵍�����Z+?P���(C���@gjޏ~�f������?v��N
endstream
endobj
3 0 obj
<</Type /XObject
/Subtype /Image
/Width 17
/Height 17
/ColorSpace /DeviceGray
/BitsPerComponent 8
/Filter /FlateDecode
/Length 121>> stream
x�c`'
我哪里错了?我引入了什么非法令牌或我遗漏了什么格式?
我发现我们不需要整个表单对象来将文件上传到服务器。我们只需要 base64 字符。为了获得这些,我必须使用 onload 事件,这意味着 AJAX 必须是同步的而不是异步的;也就是说,AJAX 必须在 onload 事件触发器内。这对我有用:
function _docs_submit() {
event.preventDefault();
upDOCS_btn.html("Uploading...");
var fileReader = new FileReader(),
base64;
// Define file reader function to read the file content and convert to base64
fileReader.onload = function(file) {
base64 = file.target.result;
data["file_base64"] = base64.split(/,/)[1];
/* Ajax - has to go in the onload event because this has to be synchronous*/
$.ajax({
xhr: function () {
var xhr = $.ajaxSettings.xhr();
xhr.upload.onprogress = function (e) {
console.log(Math.floor(e.loaded / e.total * 100) + '%');
};
return xhr;
},
url: "medcon/adddocs",
type: "POST",
enctype: 'multipart/form-data',
dataType: "json",
data: JSON.stringify(data),
cache: false,
contentType: false,
processData: false,
success: function (locks) {
alert('Thank you.\nDocument(s) received.');
//$('#gscForm')[0].reset();
self.element.remove();
$("#medcon-3").empty();
$("#medcon-3").append($('<div id="medcon">').medconlist());
$("#medcon-2").empty();
$("#medcon-2").append($('<div id="medcon">').medcon());
$("#medcon-1").empty();
//$("#medcon-1").append($('<div id="medconoverview">').medcongsc());
$("#medcons").tabs('select', '#medcon-1');
},
error: function(e) {
alert("There was an error submitting your documents:\n" + e.responseText);
console.log(e.responseText);
}
});
};
var file = $("#upDOCS").prop('files')[0],
data = {
"filename":file.name,
"filetype":file.type,
"filesize":file.size
}
fileReader.readAsDataURL(file);
}