Já jsem jen v poslední době jednání s AWS SDK a tak prosím omluvte, jestli můj přístup je úplný nesmysl.
Chci nahrát jednoduchý mediální soubor na můj S3. Byl jsem po tomto kurzu , a tak daleko jsem schopen nahrát soubory bez problému. Pro userbility progress bar by to být pěkný extra, a proto jsem hledal, jak toho dosáhnout. Rychle jsem zjistil, že aktuální AWS SDK v3 nepodporuje httpUploadProgress
už jsme ale měli použít @aws-sdk/lib-storage
místo. Pomocí této knihovny jsem stále schopen nahrát soubory na S3, ale nemůžu se dostat pokroku tracker do práce! Předpokládám, že to má něco společného se mnou ne zcela pochopit, jak se vypořádat s async
v rámci Reagovat komponenty.
Takže tady je můj minified složka příklad (já používám Čakra UI zde)
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;
Takže v podstatě vidím případě vyhazov (start upload souboru). Pak to chvíli trvá, a vidím, Slib výsledek a Progress, 100
v mé konzole. To pro mě znamená, že stát proměnná dostane aktualizovány (alespoň jednou), ale komponenta není re-render?
Co je to, co dělám špatně? Ocenil jakoukoliv pomoc!
lib-storage
nikdy neměl být použit pro malé nahrání souboru. Bohužel, zdá se, že v současné době neexistuje žádné uspokojující řešení při použití v3 (protože to je pomocí fetch api pod kapotou) a nahrávání malých souborů. Takže tvůj přístup je určitě dobré řešení, ale doufejme, že se bude realizovat něco, co v SDK velmi brzy.