RegulusReggie
RegulusReggie
  • 发布:2019-10-26 08:40
  • 更新:2019-10-26 08:40
  • 阅读:842

【报Bug】安卓PUT请求发送arraybuffer,服务器收到的数据为空

分类:uni-app

详细问题描述

(DCloud产品不会有明显的bug,所以你遇到的问题大都是在特定环境下才能重现的问题,请仔细描述你的环境和重现方式,否则DCloud很难排查解决你的问题)

[内容]
项目需求需要从安卓设备上传图片到服务器或者OSS。这里采取的是用plus.io fileReader读出图片的base64编码并转换成arraybuffer, 再通过put请求传送至服务器。请求成功但是服务器收到的数据为空。

重现步骤

[步骤]
详细见最下三段代码

[结果]
{
'content-type': 'application/binary',
'user-agent': 's631(Android/6.0) (io.dcloud.HBuilder/9.6.32) Weex/0.26.0 1280x800'',
host: 'localhost:8001',
connection: 'Keep-Alive',
'accept-encoding': 'gzip',
'content-length': '0'
}
[期望]
服务器收到完整的数据

[如果语言难以表述清晰,拍一个视频或截图,有图有真相]

IDE运行环境说明

[HBuilder 或 HBuilderX。如果你用其他工具开发uni-app,也需要在此说明]
HBuilder X

[IDE版本号]
2.3.6.20191020
[windows版本号]
Windows 10 Pro 1903 18362.418
[mac版本号]

uni-app运行环境说明

[运行端是h5或app或某个小程序?]
安卓 app
[运行端版本号]
Android 平板 s631(Android/6.0) (io.dcloud.HBuilder/9.6.32) Weex/0.26.0 1280x800

[项目是cli创建的还是HBuilderX创建的?如果是cli创建的,请更新到最新版cli再试]
HBuilderX

[编译模式是老模板模式还是新的自定义组件模式?]
自定义组件模式

App运行环境说明

[Android版本号]
Android 平板 s631(Android/6.0) (io.dcloud.HBuilder/9.6.32) Weex/0.26.0 1280x800
[iOS版本号]

[手机型号]
自主研发的平板

[模拟器型号]

附件

[IDE问题请提供HBuilderX运行日志。菜单帮助-查看运行日志,点右键打开文件所在目录,将log文件压缩成zip包上传]

[App问题请提供可重现问题的代码片段,你补充的细一点,问题就解决的快一点]

[App安装包或H5地址]

[可重现代码片段]

// 读取设备图片代码
plus.io.resolveLocalFileSystemURL(payload.imageUrl, function(entry) {
entry.file(function(file) {
const fileReader = new plus.io.FileReader();
fileReader.readAsDataURL(file);
fileReader.onloadend = async function(evt) {
try {
const response = await api.inferImage(convertDataURIToBinary(evt.target.result));
}
} catch (e) {
console.error(e);
}
}
})
}, function (e) {
console.error("Resolve file URL failed: " + e.message);
});

// 上段代码中把base64编码转换为arraybuffer的代码
import { Base64 } from "js-base64";
const BASE64_MARKER = ';base64,';

function convertDataURIToBinary(dataURI) {
let base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length;
let encoded = dataURI.substring(base64Index);
let raw = Base64.atob(encoded);
let rawLength = raw.length;
let array = new Uint8Array(new ArrayBuffer(rawLength));
for (let i = 0; i < rawLength; i++) {
array[i] = raw.charCodeAt(i);
}
return array.buffer;
}

// 服务器API调用的代码
uni.request({
url: 'http://localhost:8001/test',
data: imageData,
method: "PUT",
header: {
"Content-Type": "application/binary"
},
success: resp=> {
console.log(resp);
if (resp.statusCode === 200)
resolve(resp.data);
else
reject(resp.data);
},
fail: error => {
console.error(error);
reject(error);
}
});

联系方式

[QQ]

2019-10-26 08:40 负责人:无 分享
已邀请:

该问题目前已经被锁定, 无法添加新回复