在Web應用程序上工作時,圖像文件從瀏覽器直接進入S3存儲桶。這在Chrome中運行良好,但在Safari中沒有錯誤,但代碼最終會將空文件上傳到S3存儲桶。一切基本上看起來像在Safari中工作,S3服務器甚至會返回204
成功的http響應,並且該文件看起來像在存儲桶中(但大小爲0字節)。Javascript FormData()文件上傳到S3在Chrome中可用,但在Safari中不可用
我在調試,而blobData
在Chrome中的大小爲55747,但Safari中只有47560的大小用於同一圖像。另外,我還發現了什麼看起來略有不同的是,在網絡部分開發工具:
鉻 - 工作(204響應具有積極大小約534B):
野生動物園 - 不空文件工作(尺寸列顯示只是一個虛線)
這裏是JS上傳代碼:
function uploadFile(data_url, s3Data, url, filename, id, thumbnail_url){
var xhr = new XMLHttpRequest();
xhr.open("POST", s3Data.url);
var postData = new FormData();
for(key in s3Data.fields){
postData.append(key, s3Data.fields[key]);
}
var blobData = dataURItoBlob(data_url);
postData.append('file', new File([blobData], filename));
xhr.onreadystatechange = function() {
if(xhr.readyState === 4){
if(xhr.status === 200 || xhr.status === 204){
setTimeout(function(){
$('#photo_container').append('<div id="image_container_'+id+'" class="hover-card mdl-cell--3-col-desktop mdl-cell--2-col-tablet mdl-cell--2-col-phone mdl-shadow--2dp"></div>');
$('.star-image').unbind('click').click(star_image_click);
$('.close-image').unbind('click').click(remove_image_click);
loading_files -= 1;
if (loading_files == 0) {
$('#photo_load_spinner').removeClass('is-active');
$('#photo_load_text').text("");
}else{
$('#photo_load_text').text(loading_files+" files loading. Please wait.");
}
}, 1000);
}else{
alert("Could not upload file. "+xhr.responseText);
}
}
};
xhr.send(postData);
}
function dataURItoBlob(dataURI) {
var binary = atob(dataURI.split(',')[1]);
var array = [];
for(var i = 0; i < binary.length; i++) {
array.push(binary.charCodeAt(i));
}
return new Blob([new Uint8Array(array)], {type: 'image/png'});
}
我有點不知所措尋找下一個。任何幫助將不勝感激。謝謝!
編輯
只圖我應該給多一點信息。 data_url
是從一個canvas元素生成的,我用它來調整瀏覽器中的圖像大小,雖然我已經確認canvas在上傳之前在safari中正確顯示圖像。下面是該代碼:
function ResizeFile(raw_file) {
var reader = new FileReader();
reader.onload = function(e) {
var img = document.createElement("img");
img.onload = function() {
var canvas = document.createElement('canvas');
var ctx = canvas.getContext("2d");
//ctx.drawImage(img, 0, 0);
var MAX = 1200;
var width = img.width;
var height = img.height;
if (width > height) {
if (width > MAX) {
height *= MAX/width;
width = MAX;
}
} else {
if (height > MAX) {
width *= MAX/height;
height = MAX;
}
}
canvas.width = width;
canvas.height = height;
ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, width, height);
var dataurl = canvas.toDataURL("image/png");
getSignedRequest(dataurl);
}
img.src = e.target.result;
}
reader.readAsDataURL(raw_file);
}
你設法解決它之前執行呢?我現在有同樣的問題,我一直堅持了幾天 – user2634633
@ user2634633以及...有點解決它。所以它稱這是Safari瀏覽器的一個重要安全功能。它不允許程序改變文件輸入的內容。安全背後的想法是,它只允許上傳用戶實際選擇的文件。所以我的工作方式是在表單中使用正常的文件輸入元素,並從中進行上傳。我決定在上傳之前不要進行圖像大小調整,而是在上傳整個文件後在S3服務器上進行處理。 –
感謝您的信息。我最終裁剪並調整了客戶端大小,並將數據URI發送到服務器,服務器將其轉換爲文件並進行S3上傳。這有點迂迴,但想不到更好。 – user2634633