我使用FormData與AJAX(對於進度條,但我省略了簡單的代碼)上傳文件:爲什麼FileEntry的FormData.append文件不能正確上傳?
<form method="post" enctype="multipart/form-data">
<input type="file" name="file" />
</form>
$(document).ready(function() {
$(document).on("change", ":file", function() {
var i;
for (i = 0; i < this.files.length; i++) {
var file = this.files[i];
uploadFile(this.name, file);
}
}
}
function uploadFile(inputName, file) {
var formData = new FormData();
formData.append(inputName, file);
$.ajax({
type: "POST",
url: "/api/newfile",
data: formData,
timeout: 0,
cache: false,
contentType: false,
processData: false
}) // some code omitted...
}
這工作得很好。接下來,我有一個Apache科爾多瓦手機應用程序相同的代碼,但我添加了一個「拍照」按鈕,它採用navigator.camera.getPicture和FileEntry.file獲取文件對象,並調用相同uploadFile函數中的每個文件輸入下面的選項:
$(document).ready(function() {
$("input:file").each(function(index) {
$("<button class='take_picture_button ui-btn'>Take Picture</button>").insertAfter($(this));
});
$(document).on("click", ".take_picture_button", function(e) {
$inputFileElement = $(this).prev("input:file").first();
navigator.camera.getPicture(function(fileURI) {
window.resolveLocalFileSystemURL(fileURI, function(fileEntry) {
fileEntry.file(function(file) {
uploadFile($inputFileElement.attr("name"), file);
});
});
});
});
}); // some code omitted...
這不起作用 - 服務器只是獲取「[object Object]」而不是文件。
連接Chrome開發者工具的Android應用程序,我看到了失敗的情況下,請求負載的這一部分:
------WebKitFormBoundaryThmH13yROUHXJ4jB
Content-Disposition: form-data; name="identity_file[file]"
[object Object]
在工作情況:
------WebKitFormBoundaryztHB86BlcKBZ9dPX
Content-Disposition: form-data; name="identity_file[file]"; filename="0DuheTR.jpg"
Content-Type: image/jpeg
我想在工作它並不實際顯示文件有效載荷,但我可以確認它的工作原理。
看起來,在失敗的情況下,它沒有正確地看到File對象,因爲它不會自動添加文件名屬性,也不會自動添加Content-Type,而且似乎只是做一個天真的toString身體。該應用程序使用Cordova 6.2.0構建,並在Android 6.0.1上運行。
我在兩種情況下都在File對象上運行了console.dir,它們看起來差不多,儘管失敗案例中的proto是Object而不是File - 爲什麼?
工作:
File
lastModified: 1458490019474
lastModifiedDate: Sun Mar 20 2016 09:06:59 GMT-0700 (PDT)
name: "0DuheTR.jpg"
size: 152054
type: "image/jpeg"
webkitRelativePath: ""
__proto__: File
不合格:
File
end: 785009
lastModified: 1469992497000
lastModifiedDate: 1469992497000
localURL: "cdvfile://localhost/cache-external/1469992495873.jpg"
name: "1469992495873.jpg"
size: 785009
start: 0
type: "image/jpeg"
__proto__: Object
也許FileEntry.file沒有用正確的格式的工作?您也可以嘗試將結果添加到Blob中,並以此方式創建File對象。新的Blob([data],{type:「image/png」}); – Bram
@Bram嗨布拉姆,我不知道你的意思,因爲文件從Blob繼承。 – Kevin