【问题标题】:c# upload in real time from client to server to amazon s3c#从客户端到服务器实时上传到amazon s3
【发布时间】:2013-02-13 08:09:53
【问题描述】:

早上好,我有一个桌面应用程序,它将文件上传到 WCF 服务,然后 WCF 服务上传到 Amazon S3。

这是我接收文件并上传到 S3 的 WCF 方法。

public void UploadFile(RemoteFileInfo request)
        {
            config = new AmazonS3Config();
            config.CommunicationProtocol = Protocol.HTTP;
            accessKeyID = "XXXXXXX"; 
            secretAccessKeyID = "YYYYYYYY";
            client = Amazon.AWSClientFactory.CreateAmazonS3Client(accessKeyID, secretAccessKeyID, config);

            int chunkSize = 2048;
            byte[] buffer = new byte[chunkSize];

            using (System.IO.MemoryStream writeStream = new System.IO.MemoryStream())
            {
                do
                {
                    // read bytes from input stream
                    int bytesRead = request.FileByteStream.Read(buffer, 0, chunkSize);
                    if (bytesRead == 0) break;

                    // simulates slow connection
                    System.Threading.Thread.Sleep(3);

                    // write bytes to output stream
                    writeStream.Write(buffer, 0, bytesRead);
                } while (true);

                // report end
                Console.WriteLine("Done!");

                // start the uploading to S3
                PutObjectRequest fileRequest = new PutObjectRequest();
                fileRequest.WithInputStream(writeStream);
                fileRequest.Key = "testfile.pdf";
                fileRequest.WithBucketName("tempbucket");
                fileRequest.CannedACL = S3CannedACL.Private;
                fileRequest.StorageClass = S3StorageClass.Standard;
                client.PutObject(fileRequest);

                writeStream.Close();
            }

        }

在我的客户端上,当我将文件上传到 WCF 服务时,我会实时获得进度,但是当我得到 100% 完成时,这并不意味着文件已经上传到 S3,所以我想知道在我编写流时是否可以将文件上传到 S3(在 using

(System.IO.MemoryStream writeStream = new System.IO.MemoryStream())
            {

这可能吗?有什么指导方针吗?

提前欣赏。

【问题讨论】:

  • 不幸的是,您的问题有点不清楚(至少对我而言)。您的客户如何实时显示进度?
  • WCF 有一个功能。

标签: c# wcf amazon-s3


【解决方案1】:

您可以使用PutObjectRequestInputStream属性

public void UploadFile(RemoteFileInfo request)
{
    config = new AmazonS3Config();
    config.CommunicationProtocol = Protocol.HTTP;
    accessKeyID = "XXXXXXX"; 
    secretAccessKeyID = "YYYYYYYY";
    client = Amazon.AWSClientFactory.CreateAmazonS3Client(accessKeyID,secretAccessKeyID,config);

    int chunkSize = 2048;
    byte[] buffer = new byte[chunkSize];

    PutObjectRequest fileRequest = new PutObjectRequest();

    fileRequest.Key = "testfile.pdf";
    fileRequest.WithBucketName("tempbucket");
    fileRequest.CannedACL = S3CannedACL.Private;
    fileRequest.StorageClass = S3StorageClass.Standard;

    using (fileRequest.InputStream = new System.IO.MemoryStream())
    {
      do
      {
         // read bytes from input stream
         int bytesRead = request.FileByteStream.Read(buffer, 0, chunkSize);
         if (bytesRead == 0) break;

         // simulates slow connection
         System.Threading.Thread.Sleep(3);

         // write bytes to output stream
         fileRequest.InputStream.Write(buffer, 0, bytesRead);
       } while (true);

       // report end
       Console.WriteLine("Done!");

       client.PutObject(fileRequest);

    }
 }

【讨论】:

【解决方案2】:

我建议将文件作为块而不是流上传到 WCF。我这样做了,它工作得很好。您还需要稍后返回写入亚马逊的实际字节的消息,您可以在此基础上增加进度条。我知道这会导致您在客户端应用程序中编写一个 while 循环,但它会帮助您以 100% 的准确性显示大文件的进度。您的 WCF 函数应采用这些参数

[DataContract]
class RemoteFileInfo
{
    [DataMember]
    Byte[] myChunk;
    [DataMember]
    long myOffset;
    // other stuff you think you need to be sent each time.

}

【讨论】:

  • 如何发送块而不是流?但是 Amazon S3 是否支持上传块字节?
  • 它与 Amazon S3 无关,使用 WCF 类 RemoteFileInfo 删除流数据成员并添加另一个应该是字节数组的数据成员。您还需要另一个数据成员作为偏移量。
猜你喜欢
  • 2017-01-30
  • 1970-01-01
  • 2017-07-23
  • 2011-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
相关资源
最近更新 更多