C# S3多部分上传异常

C# S3多部分上传异常,c#,stream,amazon-s3,C#,Stream,Amazon S3,使用S3 MultiPartAPI,我得到一个异常: {“您建议的上载小于允许的最小大小”} 我用两个11MB和7MB的文件来测试它。使用1MB,它可以正常工作 FileStream fs=newfilestream(foo,FileAccess.ReadWrite) fs.CopyTo(新的S3Tools.S3CopyMemoryStream(“bar”,新字节[Buffersize+Buffersize/2],transferUtility)) 我将配置实用程序config.MinSizeB

使用S3 MultiPartAPI,我得到一个异常:

{“您建议的上载小于允许的最小大小”}

我用两个11MB和7MB的文件来测试它。使用1MB,它可以正常工作

FileStream fs=newfilestream(foo,FileAccess.ReadWrite)

fs.CopyTo(新的S3Tools.S3CopyMemoryStream(“bar”,新字节[Buffersize+Buffersize/2],transferUtility))

我将配置实用程序config.MinSizeBeforePartUpload设置为2

public class S3CopyMemoryStream : MemoryStream
    {
        private string _key;
        private byte[] _buffer;
        private S3TransferUtility _transferUtility;
        public StartUploadS3CopyFileStreamEvent StartUploadS3FileStreamEvent { get; set; }

        public int WriteCount { get; private set; }
        public bool EndOfPart { get; private set; }
        public bool InitiatingPart { get; private set; }
        public string UploadPartId { get; set; }
        public List<PartETag> PartETagCollection { get; set; }

        public S3CopyMemoryStream WithS3CopyFileStreamEvent(StartUploadS3CopyFileStreamEvent doing)
        {
            S3CopyMemoryStream s3CopyStream = new S3CopyMemoryStream(this._key, this._buffer, this._transferUtility);

            s3CopyStream.StartUploadS3FileStreamEvent = new S3CopyMemoryStream.StartUploadS3CopyFileStreamEvent(CreateMultiPartS3Blob);

            return s3CopyStream;
        }

        public S3CopyMemoryStream(string key, byte[] buffer, S3TransferUtility transferUtility)
            : base(buffer)
        {
            InitiatingPart = true;
            EndOfPart = false;
            WriteCount = 1;
            PartETagCollection = new List<PartETag>();
            QueueWithIncompleteParts = new Queue<int>();

            _buffer = buffer;
            _key = key;
            _transferUtility = transferUtility;
        }

        public delegate void StartUploadS3CopyFileStreamEvent(S3TransferUtility transferUtility, string key, S3CopyMemoryStream stream);          

        public override bool CanSeek
        {
            get { return false; }
        }

        public override void Write(byte[] array, int offset, int count)
        {
            base.Write(array, offset, count);

            if(Position >= Buffersize)
            {
                if (WriteCount > 1)
                    InitiatingPart = false;
                StartUploadS3FileStreamEvent.Invoke(_transferUtility, _key, this);

                WriteCount++;
                base.Flush();
                base.Seek(0, SeekOrigin.Begin);
                base.Flush();

            }              
        }

        public override void Close()
        {
            if(WriteCount > 1)
                InitiatingPart = false;

            EndOfPart = true;
            StartUploadS3FileStreamEvent.Invoke(_transferUtility, _key, this);
            base.Close();
        }

    }

有什么问题吗?

请求使用来自当前位置的流,因此我必须在上传之前将位置设置为零

先想后发*g


问候语

请求使用来自当前位置的流,因此我必须在上传之前将位置设置为零

先想后发*g


问候

我想我需要相同的功能,我需要从客户端和服务器上传一个文件到WCF服务,我需要开始上传到S3,同时我需要从块字节创建流。。我想你的代码符合我的要求。我说得对吗?这是我的帖子。看看我自己的答案。我想我需要相同的功能,我需要从客户端和服务器上传一个文件到WCF服务,我需要开始上传到S3,同时我需要从块字节创建流。。我想你的代码符合我的要求。我说得对吗?这是我的帖子。看看我自己的答案。总的来说,它是有效的。
 static internal void CreateMultiPartS3Blob(S3TransferUtility transferUtility, string key, S3CopyMemoryStream stream)
    {

        if (stream.InitiatingPart)
        {
            InitiateMultipartUploadRequest initiateMultipartUploadRequest =
                new InitiateMultipartUploadRequest()
                    .WithBucketName(transferUtility.BucketName)
                    .WithKey(key);


            InitiateMultipartUploadResponse initiateResponse =
                transferUtility.S3Client.InitiateMultipartUpload(initiateMultipartUploadRequest);
            stream.UploadPartId = initiateResponse.UploadId;

        }


            UploadPartRequest uploadPartRequest =
                new UploadPartRequest()
                    .WithBucketName(transferUtility.BucketName)
                    .WithKey(key)
                    .WithPartNumber(stream.WriteCount)
                    .WithPartSize(stream.Position)
                    .WithUploadId(stream.UploadPartId)
                    .WithInputStream(stream) as UploadPartRequest;

            UploadPartResponse response = transferUtility.S3Client.UploadPart(uploadPartRequest);
            PartETag etag = new PartETag(response.PartNumber, response.ETag);
            stream.PartETagCollection.Add(etag);



        if (stream.EndOfPart)
        {

            CompleteMultipartUploadRequest completeMultipartUploadRequest =
                new CompleteMultipartUploadRequest()
                    .WithBucketName(transferUtility.BucketName)
                    .WithKey(key)
                    .WithPartETags(stream.PartETagCollection)
                    .WithUploadId(stream.UploadPartId);

            CompleteMultipartUploadResponse completeMultipartUploadResponse =
                transferUtility.S3Client.CompleteMultipartUpload(completeMultipartUploadRequest);
            string loc = completeMultipartUploadResponse.Location;

        }

    }