Javascript: 将 Uint8Array 中的二进制数据转换为字符串损坏文件
Javascript: converting binary data in Uint8Array to string corrupting file
我正在尝试通过标准 jQuery $.ajax
调用将视频文件分块上传到服务器。过程很简单:
- 在文件对象上使用
slice()
方法读取块
- 使用
FileReader.readAsArrayBuffer
读取生成的blob
- 在 FileReader.onload 回调中创建该结果的
Uint8Array
- 用
String.fromCharCode.apply(null, intArrayName)
转换成二进制字符串
- 在 AJAX 调用的
data
属性 中将该二进制字符串作为一个块上传
当我完成所有块的上传时,服务器的 API 抱怨文件上传不完整。为测试此方法,我将连接的二进制字符串转换为 Blob,并Chrome 将其保存到我的下载文件夹,却发现我的媒体播放器说该文件无法播放。
我看了本站的帖子,other articles建议将整数表示的二进制数据直接转换为字符串会导致数据丢失,建议转换为base64编码的字符串,因为 Javascript 没有像 C# 那样的 StreamContent 对象。
问题是,即使我将 Content-Transfer-Encoding
设置为 base64
,我也不认为 API(不是我们编写的)接受它并且可以告诉需要base64解码。
我的问题是:这是通过 AJAX 调用安全发送视频数据的唯一可靠方法吗?如果没有,我还能如何在我的 AJAX 请求的数据字段中发送它? Internet 上可能有成千上万的上传者,但我找不到有关如何执行此操作的可靠文档。如果事实证明服务器需要 base64 编码,我们可能必须编写一个中间人 API 来为我们进行解码。
多亏了 Patrick Evans,事实证明我需要做的就是上传 blob 本身:
function upload(file) {
var offset = 0; // what's been sent already
var fileSize = file.size;
var chunkSize = 64 * 1024; // bytes
while (offset < fileSize) {
var blob = file.slice(offset, chunkSize + offset);
var urlToUse = ((offset + blob.size) >= fileSize) ? videoFinishBaseUrl : videoContinueBaseUrl;
$.ajax({
url: urlToUse,
method: 'POST',
data: blob,
headers: requestHeaders,
contentType: false,
processData: false,
cache: false,
async: false,
success: function(data) {
jQuery('#uploadmsg').text('Finished offset ' + offset);
offset += blob.size;
},
error: function(err) {
jQuery('#uploadmsg').text(err);
}
});
}
};
我正在尝试通过标准 jQuery $.ajax
调用将视频文件分块上传到服务器。过程很简单:
- 在文件对象上使用
slice()
方法读取块 - 使用
FileReader.readAsArrayBuffer
读取生成的blob - 在 FileReader.onload 回调中创建该结果的
Uint8Array
- 用
String.fromCharCode.apply(null, intArrayName)
转换成二进制字符串 - 在 AJAX 调用的
data
属性 中将该二进制字符串作为一个块上传
当我完成所有块的上传时,服务器的 API 抱怨文件上传不完整。为测试此方法,我将连接的二进制字符串转换为 Blob,并Chrome 将其保存到我的下载文件夹,却发现我的媒体播放器说该文件无法播放。
我看了本站的帖子,other articles建议将整数表示的二进制数据直接转换为字符串会导致数据丢失,建议转换为base64编码的字符串,因为 Javascript 没有像 C# 那样的 StreamContent 对象。
问题是,即使我将 Content-Transfer-Encoding
设置为 base64
,我也不认为 API(不是我们编写的)接受它并且可以告诉需要base64解码。
我的问题是:这是通过 AJAX 调用安全发送视频数据的唯一可靠方法吗?如果没有,我还能如何在我的 AJAX 请求的数据字段中发送它? Internet 上可能有成千上万的上传者,但我找不到有关如何执行此操作的可靠文档。如果事实证明服务器需要 base64 编码,我们可能必须编写一个中间人 API 来为我们进行解码。
多亏了 Patrick Evans,事实证明我需要做的就是上传 blob 本身:
function upload(file) {
var offset = 0; // what's been sent already
var fileSize = file.size;
var chunkSize = 64 * 1024; // bytes
while (offset < fileSize) {
var blob = file.slice(offset, chunkSize + offset);
var urlToUse = ((offset + blob.size) >= fileSize) ? videoFinishBaseUrl : videoContinueBaseUrl;
$.ajax({
url: urlToUse,
method: 'POST',
data: blob,
headers: requestHeaders,
contentType: false,
processData: false,
cache: false,
async: false,
success: function(data) {
jQuery('#uploadmsg').text('Finished offset ' + offset);
offset += blob.size;
},
error: function(err) {
jQuery('#uploadmsg').text(err);
}
});
}
};