Son zamanlarda AWS SDK ile uğraşıyorum ve bu nedenle yaklaşımım tamamen saçma ise lütfen özür dilerim.
S3'üme basit bir medya dosyası yüklemek istiyorum. Bu öğreticiyi takip ediyordum ve şimdiye kadar sorunsuz dosya yükleyebiliyorum. Kullanışlılık için bir ilerleme çubuğu güzel bir ekstra olurdu ve bu nedenle bunu nasıl başaracağımı araştırıyordum. Mevcut AWS SDK v3'ün desteklemediğini çabucak buldum httpUploadProgress
artık ama kullanmalıyız@aws-sdk/lib-storage
yerine. Bu kütüphaneyi kullanarak, hala S3'e dosya yükleyebiliyorum ancak ilerleme izleyicisinin çalışmasını sağlayamıyorum! Bunun nasıl başa çıkacağımı tam olarak anlamamamla bir ilgisi olduğunu varsayıyorum async
bir React bileşeni içinde.
İşte benim minified bileşen örneğim (burada Çakra UI kullanıyorum)
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;
Yani temelde olayın kovulduğunu görüyorum (dosya yüklemeyi başlat). O zaman biraz zaman alır ve Söz sonucunu ve Progress, 100
konsolumda. Bu benim için durum değişkeninin güncellendiği (en az bir kez) ancak bileşenin yeniden oluşturulmadığı anlamına mı geliyor?
Burada neyi yanlış yapıyorum? Herhangi bir yardım takdir!
lib-storage
hiçbir zaman küçük dosya yüklemeleri için kullanılmak üzere tasarlanmamıştı. Ne yazık ki, v3'ü kullanırken (kaputun altındaki getirme apı'sini kullandığı için) ve küçük dosyaları yüklerken şu anda tatmin edici bir çözüm yok gibi görünüyor. Bu yüzden yaklaşımınız kesinlikle iyi bir geçici çözümdür, ancak umarım çok yakında sdk'da bir şeyler uygulayacaklardır.