Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多部分上传到AmazonS3会覆盖最后一部分_C#_Amazon S3 - Fatal编程技术网

C# 多部分上传到AmazonS3会覆盖最后一部分

C# 多部分上传到AmazonS3会覆盖最后一部分,c#,amazon-s3,C#,Amazon S3,我正在遵循有关使用.NET客户端库进行多部分上载的文档 我遇到的问题是,发送到S3的每个部分都覆盖了最后一部分。所以换句话说,我的作品每个都是10kb(一次也尝试了5mb),每次上传都会覆盖上一次。我做错了什么 这是我得到的 var fileTransferUtility = new TransferUtility(_s3Client); var request = new TransferUtilityUploadRequest { BucketName = "mybu

我正在遵循有关使用.NET客户端库进行多部分上载的文档

我遇到的问题是,发送到S3的每个部分都覆盖了最后一部分。所以换句话说,我的作品每个都是10kb(一次也尝试了5mb),每次上传都会覆盖上一次。我做错了什么

这是我得到的

var fileTransferUtility = new TransferUtility(_s3Client);
var request = new TransferUtilityUploadRequest
    {
        BucketName = "mybucket",
        InputStream = stream,
        StorageClass = S3StorageClass.ReducedRedundancy,
        PartSize = stream.Length,//stream is 10,000 bytes at a time
        Key = fileName
    };
编辑

下面是执行多部分上传的工作代码

public UploadPartResponse UploadChunk(Stream stream, string fileName, string uploadId, List<PartETag> eTags, int partNumber, bool lastPart)
{
    stream.Position = 0;

    //Step 1: build and send a multi upload request
    if (partNumber == 1)
    {
        var initiateRequest = new InitiateMultipartUploadRequest
        {
            BucketName = _settings.Bucket,
            Key = fileName
        };

        var initResponse = _s3Client.InitiateMultipartUpload(initiateRequest);
        uploadId = initResponse.UploadId;
    }

    //Step 2: upload each chunk (this is run for every chunk unlike the other steps which are run once)
    var uploadRequest = new UploadPartRequest
                        {
                            BucketName = _settings.Bucket,
                            Key = fileName,
                            UploadId = uploadId,
                            PartNumber = partNumber,
                            InputStream = stream,
                            IsLastPart = lastPart,
                            PartSize = stream.Length
                        };

    var response = _s3Client.UploadPart(uploadRequest);

    //Step 3: build and send the multipart complete request
    if (lastPart)
    {
        eTags.Add(new PartETag
        {
            PartNumber = partNumber,
            ETag = response.ETag
        });

        var completeRequest = new CompleteMultipartUploadRequest
        {
            BucketName = _settings.Bucket,
            Key = fileName,
            UploadId = uploadId,
            PartETags = eTags
        };

        try
        {
            _s3Client.CompleteMultipartUpload(completeRequest);
        }
        catch
        {
            //do some logging and return null response
            return null;
        }
    }

    response.ResponseMetadata.Metadata["uploadid"] = uploadRequest.UploadId;
    return response;
}
public UploadPartResponse UploadChunk(流、字符串文件名、字符串uploadId、列表etag、int partNumber、bool lastPart)
{
流位置=0;
//步骤1:生成并发送多个上载请求
如果(零件号==1)
{
var initiateRequest=新的InitiateMultipartUploadRequest
{
BucketName=_settings.Bucket,
Key=fileName
};
var initResponse=_s3Client.InitiateMultipartUpload(initiateRequest);
uploadId=initResponse.uploadId;
}
//步骤2:上载每个区块(这是针对每个区块运行的,与其他只运行一次的步骤不同)
var uploadRequest=新的UploadPartRequest
{
BucketName=_settings.Bucket,
Key=fileName,
UploadId=UploadId,
零件号=零件号,
InputStream=流,
IsLastPart=最后一部分,
零件尺寸=流长度
};
var response=_s3Client.UploadPart(uploadRequest);
//步骤3:生成并发送多部分完成请求
如果(最后一部分)
{
添加(新的PartETag)
{
零件号=零件号,
ETag=response.ETag
});
var completeRequest=新的CompleteMultipartUploadRequest
{
BucketName=_settings.Bucket,
Key=fileName,
UploadId=UploadId,
PartETags=eTags
};
尝试
{
_s3Client.CompleteMultipartUpload(completeRequest);
}
接住
{
//执行一些日志记录并返回空响应
返回null;
}
}
response.ResponseMetadata.Metadata[“uploadid”]=uploadRequest.uploadid;
返回响应;
}

如果你有一个被分成10个块的流,你将点击这个方法10次,在第一个块上你将点击步骤1和2,块2-9只点击步骤2,在最后一个块上只点击步骤3。您需要将每个响应的上载id和etag发送回客户端。在步骤3中,您需要为所有片段提供etag,否则它将在S3上整合文件,而不需要更多片段。在我的客户端,我有一个隐藏字段,我在其中保存了etag列表(逗号分隔)。

这段代码设置的是一个请求,该请求将只上载一个包含一个部分的对象,因为您传入一个流,并将部分大小设置为整个流的长度


使用TransferUtility的目的是为它提供一个大的流或文件路径,并将部分大小设置为希望流分解为的增量。您还可以将PartSize留空,这将使用默认的零件尺寸。

此代码设置的是一个请求,该请求将只上载一个零件,因为您传入一个流,并将零件尺寸设置为整个流的长度


使用TransferUtility的目的是为它提供一个大的流或文件路径,并将部分大小设置为希望流分解为的增量。您也可以将PartSize留空,这将使用默认零件尺寸。

这很有意义。我能够让他们的“低级”api示例使用来自客户机的多个块来实现多部分上传。这很有意义。我能够让他们的“低级”api示例使用来自客户端的多个块实现多部分上传。谢谢,编辑中的代码帮助我实现了到S3的分块文件上传。但是,在您的代码中,就在
if(lastPart)
的开头大括号之后,
eTags.Add()
调用应该在if语句之前,我相信,为了从每个块上传中积累不同的eTags。stream.Length有效吗?我的流不可查找。在这种情况下,我无法获得流。长度或流。位置工作。它正在抛出异常。我试图删除这些部分,但在这一行中出现了“PartialWrapperStream的基本流必须是可查找的”错误s3Client.UploadPart(uploadRequest);谢谢,编辑中的代码帮助我实现了一个分块文件上传到S3。但是,在您的代码中,就在
if(lastPart)
的开头大括号之后,
eTags.Add()
调用应该在if语句之前,我相信,为了从每个块上传中积累不同的eTags。stream.Length有效吗?我的流不可查找。在这种情况下,我无法获得流。长度或流。位置工作。它正在抛出异常。我试图删除这些部分,但在这一行中出现了“PartialWrapperStream的基本流必须是可查找的”错误s3Client.UploadPart(uploadRequest);