5

おはようございます。ファイルを 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に(使用中

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

これは可能ですか?それを行う方法に関するガイドラインはありますか?

事前に感謝します。

4

2 に答える 2

0

PutObjectRequestのInputStreamプロパティを使用できます

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);

    }
 }
于 2013-02-27T14:18:37.803 に答える
0

ファイルをストリームではなくチャンクとして WCF にアップロードすることをお勧めします。私はそうしましたが、うまくいきます。また、後でアマゾンに書き込まれた実際のバイト数のメッセージを返す必要があります。それに基づいて進行状況バーを増やすことができます。クライアント アプリケーションで while ループを作成する必要があることはわかっていますが、大きなファイルの進行状況を 100% の精度で表示するのに役立ちます。WCF 関数は、次のようなパラメーターを取る必要があります

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

}
于 2013-02-27T14:28:13.083 に答える