Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.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#HTTP POST--需要跟踪POST/上传进度_C#_Http_Post - Fatal编程技术网

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

c#HTTP POST--需要跟踪POST/上传进度,c#,http,post,C#,Http,Post,我的代码可以将文件发布到预先签名的Amazon S3 url。但是,我希望跟踪大型文件的发布/上载进度。有没有一种简单的方法可以将其添加到我的代码中?我该怎么做呢?我不需要进度条,只需要向控制台输出完成的文件传输百分比,例如: 123等 WebRequest request = WebRequest.Create(PUT_URL_FINAL[0]); //PUT_URL_FINAL IS THE PRE-SIGNED AMAZON S3 URL THAT I AM SENDING THE FIL

我的代码可以将文件发布到预先签名的Amazon S3 url。

但是,我希望跟踪大型文件的发布/上载进度。有没有一种简单的方法可以将其添加到我的代码中?我该怎么做呢?

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

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

我会使用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。我可以用这个代码吗?如果是这样,你能修改代码来告诉我怎么做吗?我还需要它是同步的,而不是异步的。我可以只用“UploadData”方法吗?如果我这样做,它不会触发事件吗?我不确定。为什么需要同步?我需要在文件传输完成后进行一些处理,但处理取决于传输是否成功。您可以通过连接WebClient.OnUploadDataCompleted事件来完成上传后代码(成功或失败)。检查UploadDataCompletedEventArgs类型的参数,以获取正在设置的错误属性。