C# HTTP POST -- 需要跟踪POST/上传进度

3

我的代码可以将文件POST到预签名的Amazon S3 URL上。

然而,对于大文件,我希望能够跟踪POST/上传的进度。是否有一种简单的方法将其添加到我的代码中呢?我该如何实现?

我不需要一个进度条,只需要在控制台输出传输完成的文件百分比,例如:

1
2
3
等。

WebRequest request = WebRequest.Create(PUT_URL_FINAL[0]);
//PUT_URL_FINAL IS THE PRE-SIGNED AMAZON S3 URL THAT I AM SENDING THE FILE TO

request.Timeout = 360000; //6 minutes

request.Method = "PUT";

//result3 is the filename that I am sending                                     
request.ContentType = MimeType(result3)

byte[] byteArray =
    File.ReadAllBytes(result3);

request.ContentLength = byteArray.Length;

Stream dataStream = request.GetRequestStream();

dataStream.Write(byteArray, 0, byteArray.Length); 

dataStream.Close();

//This will return "OK" if successful.
WebResponse response = request.GetResponse();
Console.WriteLine("++ HttpWebResponse: " +
                  ((HttpWebResponse)response).StatusDescription);
1个回答

7
我会使用WebClient的UploadDataAsync()方法,并与其UploadProgressChanged事件相关联。
--更新:将示例更改为使用UploadDataAsync而不是UploadFileAsync
稍微修改了MSDN上的示例:
    public static void UploadDataInBackground (string address, byte[] data)
    {
        WebClient client = new WebClient ();
        Uri uri = new Uri(address);


        // Specify a progress notification handler.
        client.UploadProgressChanged += new UploadProgressChangedEventHandler(UploadProgressCallback);
        client.UploadDataAsync (uri, "POST", data);
        Console.WriteLine ("Data upload started.");
    }

private static void UploadProgressCallback(object sender, UploadProgressChangedEventArgs e)
{
    // Displays the operation identifier, and the transfer progress.
    Console.WriteLine("{0}    uploaded {1} of {2} bytes. {3} % complete...", 
        (string)e.UserState, 
        e.BytesSent, 
        e.TotalBytesToSend,
        e.ProgressPercentage);
}

我需要在使用S3的预签名URL时将内容类型(.ContentType)传递给S3,否则它将不允许我发布到S3。我能用这段代码实现吗?如果可以,请修改代码以显示给我如何实现。 - fraXis
我还需要它是同步的而不是异步的。我可以只使用“UploadData”方法吗?如果这样做,它会触发事件吗? - fraXis
我不确定。为什么它需要同步? - jglouie
文件传输完成后,我需要进行一些处理,但这取决于传输是否成功。 - fraXis
1
您可以通过绑定WebClient.OnUploadDataCompleted事件来执行上传后的代码(成功或失败)。检查类型为UploadDataCompletedEventArgs的参数,以查看是否设置了Error属性。 - jglouie
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接