我正试图使用axios和预签名的url将视频从IOS设备库上传到S3。我已经确定axios/s3部分工作得很好,但问题来自我从"react native image picker"收到的uri。
当我在react native中录制视频时,视频uri在S3中上传得很好,但当我从照片库中获取视频时,它会上传到S3,但它不是视频文件。
我使用react原生图像选择器从我的ios设备库中获取视频uri。
import {launchImageLibrary} from 'react-native-image-picker';
launchImageLibrary({mediaType: "video"}, ({assets}) => {
let {uri} = assets[0] //uri = /var/mobile/Containers/Data/Application/123/tmp/IMG_1779.mov
uploadFile(uri)
});
然后我尝试将uri上传到S3
//save to s3 using presignedPost
uploadFile(uri){
var formData = new FormData();
...
formData.append("file", { uri });
await axios.post(presignedPost.url, formData,{ 'Content-Type': 'multipart/form-data' } )
}
该函数是成功的,但当我在AWS中查看时,该文件只是一个包含一堆随机字符的文本文件。
好消息是,如果我用react原生相机录制视频,文件功能也会起作用
import { RNCamera } from 'react-native-camera';
stopRecord(){
let camera = cameraRef.current //grab camera <RNCamera ref={cameraRef} />
let {uri = null} = await camera.recordAsync(); //uri = /var/mobile/Containers/Data/Application/123/Library/Caches/Camera/123.mov
uploadFile(uri)
}
我能看到的唯一区别是录制视频后的uri存储在缓存中。因此,我尝试使用"react native fs"来获取picker uri,将其保存到缓存中,然后上传缓存的文件,但我收到了同样的错误(文件上传到s3,但没有上传视频(。
import * as RNFS from 'react-native-fs';
uploadFileTwo(uri){
let base64Data = await RNFS.readFile(uri, 'base64')
let cachePath = RNFS.CachesDirectoryPath + "/" + fileName + ".mov"
await RNFS.writeFile(cachePath, base64Data, 'base64')
var formData = new FormData();
...
formData.append("file", { uri: cachePath });
await axios.post(presignedPost.url, formData,{ 'Content-Type': 'multipart/form-data' } )
}
所以现在我没有选择了。为什么"react native camera"uri工作得很好,而"react native image picker"uri却不行?
按照教程上传视频文件。
我认为本教程满足了您的所有要求,因为它使用react原生图像选择器上传视频文件。