1 回答

TA貢獻(xiàn)1860條經(jīng)驗 獲得超8個贊
為什么要自己拼 form-data 呢,既然都用了 canvas 壓縮了,那瀏覽器肯定已經(jīng)支持 formData了啊。
方法一 使用 formData API 而非自己拼接
var xhr = new XMLHttpRequest(); xhr.open('POST', '/upload', true);var formData = new FormData(); formData.append(name, value); formData.append(name, fileBlob, filename); xhr.send(formData);
方法二 自己拼
壓縮使用的是 canvas,調(diào)用canvas的toBlob對象,然后使用fileReader的readAsBinaryString方法,得到blob對象的二進(jìn)制字符串,這個二進(jìn)制字符串才是 formdata 的content-disposition下面要填的東西。
你那個代碼有點亂,看樣子 imageView.attr('src') 是拿到了壓縮后圖片的 base64 的 dataURI,看有沒有方法能直接拿到 binary String,如果不能,能獲得壓縮后的圖片的 blob 對象也行,自己用 fileReader 轉(zhuǎn)換一下,再不行就用你的 dataURItoBlob 對象把 base64 的 dataURI 轉(zhuǎn)換成blob,再轉(zhuǎn)換成二進(jìn)制字符串。
bodyData += imageUrl === null ? '' : dataURItoBlob(imageUrl);
// 這一句要改成
var resizedImageBlob = dataURItoBlob(imageUrl);
var reader = new FileReader();
reader.onloadend = function () {
bodyData += this.result;
};
reader.readAsBinaryString(resizedImageBlob);
// 鑒于你代碼本身有一個each循環(huán),bodyData 最后還要 append 一個 boundary因為把 blob 轉(zhuǎn)成二進(jìn)制字符串的過程是異步的,這里的控制邏輯肯定要修改
添加回答
舉報