function base64ToBlob(base64Data, contentType) {
contentType = contentType || '';
var sliceSize = 1024;
var byteCharacters = atob(base64Data.split(',')[1]);
var bytesLength = byteCharacters.length;
var slicesCount = Math.ceil(bytesLength / sliceSize);
var byteArrays = new Array(slicesCount);
for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {
var begin = sliceIndex * sliceSize;
var end = Math.min(begin + sliceSize, bytesLength);
var bytes = new Array(end - begin);
for (var offset = begin, i = 0; offset < end; ++i, ++offset) {
bytes[i] = byteCharacters[offset].charCodeAt(0);
}
byteArrays[sliceIndex] = new Uint8Array(bytes);
}
return new Blob(byteArrays, { type: contentType });
}
function sendBase64AsMultipart(base64Image, url) {
// 提取MIME类型
var mimeType = base64Image.match(/data:([a-zA-Z0-9]+\/[a-zA-Z0-9-.+]+).*,.*/)[1];
// 转换为Blob
var blob = base64ToBlob(base64Image, mimeType);
// 创建FormData
var formData = new FormData();
formData.append('file', blob, 'image.png'); // 第三个参数是文件名
// 使用jQuery发送
$.ajax({
url: url,
type: 'POST',
data: formData,
processData: false, // 告诉jQuery不要处理数据
contentType: false, // 告诉jQuery不要设置Content-Type
success: function(response) {
console.log('上传成功', response);
},
error: function(xhr, status, error) {
console.error('上传失败', error);
}
});
}
// 使用示例
var base64Image = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z/C/HgAGgwJ/lK3Q6wAAAABJRU5ErkJggg==';
sendBase64AsMultipart(base64Image, '/upload');
data:image/png;base64,
)atob()
解码Base64字符串FormData
对象构建multipart/form-data格式processData: false
- 防止jQuery自动转换数据contentType: false
- 让浏览器自动设置正确的Content-Type问题1: 上传后服务器接收到的文件损坏
问题2: 跨域请求被阻止
问题3: 大文件上传失败
如果不使用jQuery,可以使用原生Fetch API:
fetch(url, {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error(error));
这种方法更现代且不依赖jQuery。
没有搜到相关的文章