asp.net - example - aws net
Transmita un archivo de varios GB a AWS S3 desde ASP.NET Core Web API (1)
Para tales situaciones, AWS docs proporciona dos opciones:
- Uso de AWS .NET SDK para la carga de varias partes (API de alto nivel)
- Uso de AWS .NET SDK para carga de partes múltiples (API de bajo nivel)
La API de alto nivel simplemente sugiere que cree una TransferUtilityUploadRequest
con un PartSize
especificado, por lo que la clase en sí misma podría cargar el archivo sin necesidad de mantener la carga usted mismo. En este caso, puede obtener el progreso en la carga de StreamTransferProgress
al suscribirse al evento StreamTransferProgress
. Puede cargar un archivo, una secuencia o un directorio.
La API de bajo nivel , obviamente, es más complicada, pero más flexible: puede iniciar la carga y luego cargar la siguiente parte de un archivo en un bucle. Código de muestra de la documentación:
var s3Client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1);
// List to store upload part responses.
var uploadResponses = new List<UploadPartResponse>();
// 1. Initialize.
var initiateRequest = new InitiateMultipartUploadRequest
{
BucketName = existingBucketName,
Key = keyName
};
var initResponse = s3Client.InitiateMultipartUpload(initRequest);
// 2. Upload Parts.
var contentLength = new FileInfo(filePath).Length;
var partSize = 5242880; // 5 MB
try
{
long filePosition = 0;
for (var i = 1; filePosition < contentLength; ++i)
{
// Create request to upload a part.
var uploadRequest = new UploadPartRequest
{
BucketName = existingBucketName,
Key = keyName,
UploadId = initResponse.UploadId,
PartNumber = i,
PartSize = partSize,
FilePosition = filePosition,
FilePath = filePath
};
// Upload part and add response to our list.
uploadResponses.Add(s3Client.UploadPart(uploadRequest));
filePosition += partSize;
}
// Step 3: complete.
var completeRequest = new CompleteMultipartUploadRequest
{
BucketName = existingBucketName,
Key = keyName,
UploadId = initResponse.UploadId,
};
// add ETags for uploaded files
completeRequest.AddPartETags(uploadResponses);
var completeUploadResponse = s3Client.CompleteMultipartUpload(completeRequest);
}
catch (Exception exception)
{
Console.WriteLine("Exception occurred: {0}", exception.ToString());
var abortMPURequest = new AbortMultipartUploadRequest
{
BucketName = existingBucketName,
Key = keyName,
UploadId = initResponse.UploadId
};
s3Client.AbortMultipartUpload(abortMPURequest);
}
La versión asincrónica de UploadPart
está disponible, por lo que debe investigar esa ruta, si necesita un control total de sus cargas.
Deseo crear un archivo grande (multi-GB) en un contenedor AWS S3 desde una API web ASP.NET Core. El archivo es lo suficientemente grande como para no cargar el Stream
en la memoria antes de cargarlo en AWS S3.
Con PutObjectAsync()
, me veo obligado a rellenar previamente Stream
antes de pasarlo al SDK de AWS, que se ilustra a continuación:
var putObjectRequest = new PutObjectRequest
{
BucketName = "my-s3-bucket",
Key = "my-file-name.txt",
InputStream = stream
};
var putObjectResponse = await amazonS3Client.PutObjectAsync(putObjectRequest);
Mi patrón ideal implicaría que AWS SDK devolviera un StreamWriter
(de géneros) podría Write()
muchas veces y luego Finalise()
cuando haya terminado.
Dos preguntas sobre mi desafío:
- ¿Estoy desinformado sobre tener que completar previamente el
Stream
antes de llamar aPutObjectAsync()
? - ¿Cómo debo subir mi archivo grande (multi-GB)?