我只是最近处理与 传输 ,并因此请原谅如果我的方法完全是胡说八道。
我想上传一个简单的媒体文件到我的S3。 我是以下 这个教程 和迄今为止,我能够上传文件而不是一个问题。 为userbility进度条会是一个不错的额外因此,我正在研究如何实现这一点。 我很快就发现, 目前的传输 v3 不支持 httpUploadProgress
再 但是,我们应该使用 @aws-sdk/lib-storage
代替。 使用这个图书馆,我仍然能够将文件上传到S3但我不能获取的进展跟踪工作! 我以为这有什么我不完全了解如何处理 async
在一个反应的组成部分。
因此,这里是我缩小成分的实例(我采用轮UI在这里)
const TestAWS: React.FC = () => {
const inputRef = useRef<HTMLInputElement | null>(null);
const [progr, setProgr] = useState<number>();
const region = "eu-west-1";
const bucketname = "upload-test";
const handleClick = async () => {
inputRef.current?.click();
};
const handleChange = (e: any) => {
console.log('Start file upload');
const file = e.target.files[0];
const target = {
Bucket: bucketname,
Key: `jobs/${file.name}`,
Body: file,
};
const s3 = new S3Client({
region: region,
credentials: fromCognitoIdentityPool({
client: new CognitoIdentityClient({ region: region }),
identityPoolId: "---MY ID---",
}),
});
const upload = new Upload({
client: s3,
params: target,
});
const t = upload.on("httpUploadProgress", progress => {
console.log("Progress", progress);
if (progress.loaded && progress.total) {
console.log("loaded/total", progress.loaded, progress.total);
setProgr(Math.round((progress.loaded / progress.total) * 100)); // I was expecting this line to be sufficient for updating my component
}
});
await upload.done().then(r => console.log(r));
};
console.log('Progress', progr);
return (
<InputGroup onClick={handleClick}>
<input ref={inputRef} type={"file"} multiple={false} hidden accept='video/*' onChange={e => handleChange(e)} />
<Flex layerStyle='uploadField'>
<Center w='100%'>
<VStack>
<PlusIcon />
<Text>Choose Video File</Text>
</VStack>
</Center>
</Flex>
{progr && <Progress value={progr} />}
</InputGroup>
);
};
export default TestAWS;
所以基本上我看到事件得到解雇了 (启动文件上载). 然后它需要一段时间,我看到的结果和承诺 Progress, 100
在我的控制台。 这对我意味着国家变得到更新(至少一次),但该件没有重新呈现的?
它是什么我在做什么错在这里? 任何帮助,感谢!
lib-storage
从来就不是用于小型的文件上传。 不幸的是,它似乎目前还没有令人满意的解决方案时使用 v3 (因为它使用取api引擎盖下)和上传小的文件。 所以你的方式绝对是一个很好的解决方法,但希望他们将会实施的东西在SDK很快。