Yo soy sólo recientemente el trato con el SDK de AWS y por lo tanto por favor, disculpe si mi enfoque es una completa tontería.
Quiero subir un simple archivo de medios a mi S3. Yo estaba siguiendo este tutorial y por ahora no soy capaz de subir archivos sin problema. Para userbility una barra de progreso sería un buen extra y por lo tanto yo estaba investigando cómo lograr esto. Rápidamente me di cuenta de que el actual AWS SDK v3 no apoyo httpUploadProgress
ya , pero debemos utilizar @aws-sdk/lib-storage
en su lugar. El uso de esta biblioteca, aún soy capaz de subir archivos para el S3 pero no puedo conseguir el progreso tracker a la obra! Supongo que esto tiene algo que ver con que no me la plena comprensión de cómo lidiar con async
dentro de un Reaccionan componente.
Así que aquí está mi record de componente ejemplo (estoy usando el Chakra de la interfaz de usuario de aquí)
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;
Así que, básicamente, veo el caso de ser despedido (inicio de carga de archivos). A continuación, toma un tiempo y veo que la Promesa de resultados y la Progress, 100
en mi consola. Esto para mí significa que la variable de estado se actualiza (al menos una vez), pero el componente no vuelva a representar?
¿Qué es lo que estoy haciendo mal aquí? Cualquier ayuda apreciada!
lib-storage
nunca fue destinado a ser utilizado para los pequeños de la carga de archivos. Por desgracia, parece que actualmente no hay una solución satisfactoria cuando se utiliza v3 (ya que es mediante la recuperación de la api de bajo el capó) y la carga de archivos pequeños. Por lo que su enfoque es sin duda una buena solución, pero esperemos que implementar algo en el SDK muy pronto.