Ja som len nedávno sa zaoberajú AWS SDK a preto prosím ospravedlňte, ak môj prístup je úplný nezmysel.
Chcem nahrať jednoduchý mediálny súbor moja S3. Bol som nasledujúce tento návod a doteraz som schopný nahrávať súbory bez problémov. Pre userbility pokrok bar by byť pekný extra a preto som skúmal, ako to dosiahnuť. Rýchlo som zistil, že súčasné AWS SDK v3 nepodporuje httpUploadProgress
už by sme však mali používať @aws-sdk/lib-storage
namiesto toho. Pomocou tejto knižnice, som stále schopný nahrávať súbory na S3, ale nemôžem si pokrok tracker do práce! Predpokladám, že to má čo do činenia so mnou nie je plne pochopiť, ako sa vysporiadať s async
v rámci Reagovať komponentu.
Takže tu je môj minified komponent príklad: (ja používam Čakra UI tu)
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 podstate som sa pozri prípade dostať padáka (začnite nahrávanie súboru). Potom to chvíľu trvá a vidím Sľub výsledok a Progress, 100
v mojom konzoly. To pre mňa znamená, že štát premennej dostane aktualizované (aspoň raz), ale komponent nie je re-vykreslenie?
Čo je to, čo robím zle? Akákoľvek pomoc ocenia!
lib-storage
nikdy nebolo malo byť použitý pre malé uploadovať súbory. Bohužiaľ, zdá sa, že v súčasnosti nie je uspokojujúce riešenie pri použití v3 (pretože je to pomocou fetch api pod kapotu) a nahrávanie malé súbory. Takže váš prístup je určite dobré riešenie, ale dúfajme, že sa bude realizovať niečo v SDK veľmi skoro.