예제 #1
0
        /// <summary>
        /// Runs the multipart upload.
        /// </summary>
        public override void Execute()
        {
            int timeout = this._config.DefaultTimeout;

            if (this._fileTransporterRequest.Timeout != 0)
            {
                timeout = this._fileTransporterRequest.Timeout;
            }

            InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest()
                                                         .WithBucketName(this._fileTransporterRequest.BucketName)
                                                         .WithKey(this._fileTransporterRequest.Key)
                                                         .WithCannedACL(this._fileTransporterRequest.CannedACL)
                                                         .WithContentType(determineContentType())
                                                         .WithStorageClass(this._fileTransporterRequest.StorageClass)
                                                         .WithBeforeRequestHandler(RequestEventHandler) as InitiateMultipartUploadRequest;

            if (this._fileTransporterRequest.metadata != null && this._fileTransporterRequest.metadata.Count > 0)
            {
                initRequest.WithMetaData(this._fileTransporterRequest.metadata);
            }
            if (this._fileTransporterRequest.Headers != null && this._fileTransporterRequest.Headers.Count > 0)
            {
                initRequest.AddHeaders(this._fileTransporterRequest.Headers);
            }

            InitiateMultipartUploadResponse initResponse = this._s3Client.InitiateMultipartUpload(initRequest);

            this._logger.DebugFormat("Initiated upload: {0}", initResponse.UploadId);

            try
            {
                this._logger.DebugFormat("Queue up the UploadPartRequests to be executed");
                long filePosition = 0;
                for (int i = 1; filePosition < this._contentLength; i++)
                {
                    UploadPartRequest uploadRequest = new UploadPartRequest()
                                                      .WithBucketName(this._fileTransporterRequest.BucketName)
                                                      .WithKey(this._fileTransporterRequest.Key)
                                                      .WithUploadId(initResponse.UploadId)
                                                      .WithTimeout(timeout)
                                                      .WithPartNumber(i)
                                                      .WithPartSize(this._partSize)
                                                      .WithSubscriber(new EventHandler <UploadPartProgressArgs>(this.uploadPartProgressEventCallback))
                                                      .WithBeforeRequestHandler(RequestEventHandler) as UploadPartRequest;

                    if (this._fileTransporterRequest.IsSetFilePath())
                    {
                        uploadRequest
                        .WithFilePosition(filePosition)
                        .WithFilePath(this._fileTransporterRequest.FilePath);
                    }
                    else
                    {
                        uploadRequest.InputStream = this._fileTransporterRequest.InputStream;
                    }

                    this._partsToUpload.Enqueue(uploadRequest);
                    filePosition += this._partSize;
                }

                this._totalNumberOfParts = this._partsToUpload.Count;
                this._logger.DebugFormat("Starting threads to execute the {0} UploadPartRequests in the queue", this._totalNumberOfParts);
                startInvokerPool();

                this._logger.DebugFormat("Waiting for threads to complete. ({0})", initResponse.UploadId);
                waitTillAllThreadsComplete();

                this._logger.DebugFormat("Beginning completing multipart. ({0})", initResponse.UploadId);
                CompleteMultipartUploadRequest compRequest = new CompleteMultipartUploadRequest()
                                                             .WithBucketName(this._fileTransporterRequest.BucketName)
                                                             .WithKey(this._fileTransporterRequest.Key)
                                                             .WithUploadId(initResponse.UploadId)
                                                             .WithPartETags(this._uploadResponses)
                                                             .WithBeforeRequestHandler(RequestEventHandler) as CompleteMultipartUploadRequest;
                this._s3Client.CompleteMultipartUpload(compRequest);
                this._logger.DebugFormat("Done completing multipart. ({0})", initResponse.UploadId);
            }
            catch (Exception e)
            {
                this._logger.Error(string.Format("Exception while uploading. ({0})", initResponse.UploadId), e);
                shutdown(initResponse.UploadId);
                throw;
            }
            finally
            {
                if (this._fileTransporterRequest.InputStream != null && !this._fileTransporterRequest.IsSetFilePath())
                {
                    this._fileTransporterRequest.InputStream.Close();
                }
            }
        }
예제 #2
0
        /// <summary>
        /// Runs the multipart upload.
        /// </summary>
        public override void Execute()
        {
            int timeout = this._config.DefaultTimeout;

            if (this._fileTransporterRequest.Timeout != 0)
            {
                timeout = this._fileTransporterRequest.Timeout;
            }

            InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest
            {
                BucketName   = this._fileTransporterRequest.BucketName,
                Key          = this._fileTransporterRequest.Key,
                CannedACL    = this._fileTransporterRequest.CannedACL,
                ContentType  = determineContentType(),
                StorageClass = this._fileTransporterRequest.StorageClass,
                ServerSideEncryptionMethod = this._fileTransporterRequest.ServerSideEncryptionMethod
            };

            initRequest.BeforeRequestEvent += RequestEventHandler;

            if (this._fileTransporterRequest.metadata != null && this._fileTransporterRequest.metadata.Count > 0)
            {
                initRequest.WithMetaData(this._fileTransporterRequest.metadata);
            }
            if (this._fileTransporterRequest.Headers != null && this._fileTransporterRequest.Headers.Count > 0)
            {
                initRequest.AddHeaders(this._fileTransporterRequest.Headers);
            }

            InitiateMultipartUploadResponse initResponse = this._s3Client.InitiateMultipartUpload(initRequest);

            _logger.DebugFormat("Initiated upload: {0}", initResponse.UploadId);

            try
            {
                _logger.DebugFormat("Queue up the UploadPartRequests to be executed");
                long filePosition = 0;
                for (int i = 1; filePosition < this._contentLength; i++)
                {
                    UploadPartRequest uploadRequest = new UploadPartRequest
                    {
                        BucketName = this._fileTransporterRequest.BucketName,
                        Key        = this._fileTransporterRequest.Key,
                        UploadId   = initResponse.UploadId,
                        Timeout    = timeout,
                        PartNumber = i,
                        PartSize   = this._partSize
                    };
                    uploadRequest.UploadPartProgressEvent += new EventHandler <UploadPartProgressArgs>(this.uploadPartProgressEventCallback);
                    uploadRequest.BeforeRequestEvent      += RequestEventHandler;

                    if (this._fileTransporterRequest.IsSetFilePath())
                    {
                        uploadRequest.FilePosition = filePosition;
                        uploadRequest.FilePath     = this._fileTransporterRequest.FilePath;
                    }
                    else
                    {
                        uploadRequest.InputStream = this._fileTransporterRequest.InputStream;
                    }

                    this._partsToUpload.Enqueue(uploadRequest);
                    filePosition += this._partSize;
                }

                this._totalNumberOfParts = this._partsToUpload.Count;
                _logger.DebugFormat("Starting threads to execute the {0} UploadPartRequests in the queue", this._totalNumberOfParts);
                startInvokerPool();

                _logger.DebugFormat("Waiting for threads to complete. ({0})", initResponse.UploadId);
                waitTillAllThreadsComplete();

                _logger.DebugFormat("Beginning completing multipart. ({0})", initResponse.UploadId);
                CompleteMultipartUploadRequest compRequest = new CompleteMultipartUploadRequest
                {
                    BucketName = this._fileTransporterRequest.BucketName,
                    Key        = this._fileTransporterRequest.Key,
                    UploadId   = initResponse.UploadId,
                };
                compRequest.WithPartETags(this._uploadResponses);
                compRequest.BeforeRequestEvent += RequestEventHandler;
                this._s3Client.CompleteMultipartUpload(compRequest);
                _logger.DebugFormat("Done completing multipart. ({0})", initResponse.UploadId);
            }
            catch (Exception e)
            {
                _logger.Error(e, "Exception while uploading. ({0})", initResponse.UploadId);
                shutdown(initResponse.UploadId);
                throw;
            }
            finally
            {
                if (this._fileTransporterRequest.InputStream != null && !this._fileTransporterRequest.IsSetFilePath() && this._fileTransporterRequest.AutoCloseStream)
                {
                    this._fileTransporterRequest.InputStream.Close();
                }
                if (_logger != null)
                {
                    _logger.Flush();
                }
            }
        }