我正在使用Twilio 的 Conversations API在聊天中开发图像发送功能。图像发送在调试环境中的设备和模拟器上完美运行,但不适用于 iOS 和 Android (APK/IPA) 的发布版本。
选择图像的代码:
function handlePickImage(){
ImagePicker.openPicker({
multiple: true,
width: 300,
height: 400,
cropping: true,
}).then(image => {
var tmpObject = {};
image.forEach(img => tmpObject[img.filename] = img)
imagesData = {...tmpObject};
onSend(messages, conversation)
}
);
}
发送图像的代码:
for (const fileName in imagesData) {
const form = new FormData();
form.append('file', {
uri: imagesData[fileName].path,
type: imagesData[fileName].mime,
name: imagesData[fileName].filename,
});
form.append('ContentType', imagesData[fileName].mime);
conversation.sendMessage(form)
.then(i => {
console.log('Successfully sent media message. Form: ', objToStr(form['_parts'][0][1]))
alert('Successfully sent media message. Form: ' + objToStr(form['_parts'][0][1]))
})
.catch(err => {
console.log('error sending media message. Form: ', objToStr(form['_parts'][0][1]), ' err: ', err)
alert('error sent media message. Form: ' + objToStr(form['_parts'][0][1]) + ' err: ' + err )
});
}
imagesData = {}
}
图片选择器的 URI 来自应用程序的内部存储缓存,类似于file:///data/user/0/app.package.name/cache/rn_image_picker_lib_temp_344443-34rf-34rf.png
. 该类型是 mime 类型,看起来像image/png
.
如果我将 URI 硬编码为来自网络的内容,例如https://picsum.photos/200,图像会在发布时发送。
这是错误的屏幕截图。如果我传递{media: base64string}
给 sendMessage 函数,我可以在调试环境中重现此错误。所以不知何故在发布时,它无法理解FormData
并相信它是{media: base64string}
。它很可能与 URI 有关。Image
这也不是权限问题,因为当使用同一个库从手机的图库中挑选图像时,图像确实显示在组件中。
相关包版本:
"react": "16.13.1",
"react-native": "0.63.4",
"@twilio/conversations": "^1.1.0",
"react-native-image-crop-picker": "^0.36.2",