Eu sunt doar recent de-a face cu AWS SDK și, astfel, vă rugăm să scuză dacă abordarea mea este un nonsens complet.
Vreau să încărcați un simplu fișier media la S3-ul meu. Am urmat acest tutorial si pana acum sunt capabil de a încărca fișiere fără nici o problemă. Pentru userbility o bară de progres va fi un plus frumos și, prin urmare, am fost cercetat modul de a realiza acest lucru. Am aflat destul de repede că actuala AWS SDK v3 nu are suport httpUploadProgress
mai dar ar trebui să utilizați @aws-sdk/lib-storage
în schimb. Folosind această bibliotecă, sunt în continuare capabil de a încărca fișiere la S3 dar eu nu pot obține progres tracker de la locul de muncă! Presupun că asta are ceva de-a face cu mine nu înțelege pe deplin cum să se ocupe cu async
într-un Reacționa componentă.
Deci, aici este meu minified componentă exemplu (eu sunt, folosind Chakra UI aici)
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;
Deci, practic eveniment concediat (start upload). Apoi este nevoie de un timp și văd Promisiunea rezultatul și Progress, 100
în consola mea. Acest lucru înseamnă că variabila de stare devine actualizate (cel puțin o dată), dar componenta nu se re-face?
Ce este ceea ce fac greșit aici? Orice ajutor apreciat!
lib-storage
nu a fost niciodată menit să fie folosit pentru mici încărcări de fișiere. Din păcate, se pare că nu există în prezent nici o soluție satisfăcătoare atunci când se utilizează v3 (deoarece este folosind aduce api sub capota) și încărcarea de fișiere mici. Deci, abordarea ta este cu siguranta o soluție bună, dar sperăm că se va pune în aplicare ceva în SDK foarte curând.