subir net example aws archivos asp.net amazon-web-services amazon-s3 stream .net-core

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:

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 a PutObjectAsync() ?
  • ¿Cómo debo subir mi archivo grande (multi-GB)?