我通过API调用上传文件,该调用需要将文件放在Request主体中并使用PUT。使用以下代码,我可以上传创建文件的内容并返回200状态。 rawData长度恰好是基于初始文件大小的预期长度。但是,创建的文件有一些额外的字节,无法打开。例如,我在234 kb上传的jpg文件在上传后有352 kb,而从12 kb开始的docx文件在上传后有17 kb。
var contentType = file.type;
var reader = new FileReader();
reader.onload = function (e) {
var rawData = reader.result;
$http({
url: appSettings.serverPath + '/File/' + fileId + '/Content',
method: 'PUT',
headers: { 'Content-Type': undefined },
data: rawData,
transformRequest: []
}).success(function (data, status, headers, config) {
deferred.resolve(data);
}).error(function (error) {
deferred.reject(error);
});
};
reader.readAsBinaryString(file);
除了使用未定义的'Content-Type'之外,我还使用了文件的内容类型,但我遇到了同样的问题。
我尝试在FileReader上调用readAsArrayBuffer方法并传入rawData的Uint8Array,但是它不传递Request上的任何数据并创建一个0字节的文件。
我还尝试在FileReader上调用readAsDataURL方法,该方法对数据进行完全不同的编码,这样我的rawData和生成的文件对于jpg来说是313 kb。该文件仍然已损坏,无法打开。
我是否应该采取一些额外的编码来发送正确的数据?
提前致谢!!
答案 0 :(得分:0)
无需使用FileReader API来读取文件。 XHR Send Method自动序列化文件对象,因为它们是Blob object的特殊类型。
//var contentType = file.type;
//var reader = new FileReader();
//reader.onload = function (e) {
// var rawData = reader.result;
return $http({
url: appSettings.serverPath + '/File/' + fileId + '/Content',
method: 'PUT',
headers: { 'Content-Type': undefined },
//data: rawData,
data: file
//transformRequest: []
};
/* }).success(function (data, status, headers, config) {
deferred.resolve(data);
}).error(function (error) {
deferred.reject(error);
});
*/
//reader.readAsBinaryString(file);
此外,无需使用$q.defer
制作承诺,因为$ http服务已经返回承诺。
.success
和.error
方法也是deprecated and removed from Angular V1.6.
rawData长度恰好是基于初始文件大小的预期长度。但是,创建的文件有一些额外的字节,无法打开。例如,我在234 kb上传的jpg文件在上传后有352 kb,而从12 kb开始的docx文件在上传后有17 kb。
//reader.readAsBinaryString(file);
reader.readAsArrayBuffer(file)
XHR Send Method将二进制字符串(DOMstring)转换为UTF-8。这意味着128-255范围内的数据字节用2个字节编码。不要将二进制数据转换为DOMstrings。使用ArrayBuffer API。
FileReader.readAsBinaryString()
非标准
此功能不符合标准,不符合标准。不要在面向Web的生产站点上使用它:它不适用于每个用户。实现之间可能存在很大的不兼容性,并且行为可能在将来发生变化。
[It]现已根据W3C 2012年7月12日的工作草案弃用。
— MDN Developer Reference - Web APIs - FileReader.readAsBinaryString()