【问题标题】:Uploading a file using system.net.webclient使用 system.net.webclient 上传文件
【发布时间】:2017-04-24 23:43:20
【问题描述】:

我正在尝试使用 System.Net.WebClient 或其他方法重新创建一个 curl 命令以在 C# 中上传文件,但我只是没有运气将文件和名称-值的东西一起发送,以及curl 使用的身份验证。有谁知道这其中的诀窍?我仅限于框架 4.0。

我只需要将一个简单的 csv 文件发送到一个 URL,如下所述:http://quickfuseapps.com/docs/api/sdb_upload_csv

命令本身是:

curl -u username:password -F tablekey=username:customers -F mode=replace -F csv=@customerdata.csv http://quickfuseapps.com/api/1/sdb/upload/csv

我使用我找到的代码 sn-p 和类尝试了这个,但它不允许网络凭据

Helpers.MultipartForm form = new Helpers.MultipartForm("http://quickfuseapps.com/api/1/sdb/upload/csv");
form.SetField("tablekey", "user:table");
form.SetField("mode", "replace");
// NO auth method to set credentials

form.SendFile(@"d:\test.csv");  form.SetField("tablekey", "user:table");
form.SetField("mode", "replace");
// NO auth method to set credentials

form.SendFile(@"d:\test.csv");

这里的代码将设置表单字段和身份验证,但也不允许文件上传

using (var client = new WebClient())
{
    var values = new NameValueCollection();
    values.Add("app_id", "5gxWWnLlg");
    values.Add("tablekey", "user:table");                
    values.Add("dial_col", "PhoneNumber");
    values.Add("result_col", "outbound_result");

    client.Credentials = new NetworkCredential("user", "pwd");
    client.Encoding = Encoding.ASCII;

    //var response = client.UploadValues("http://quickfuseapps.com/api/1/outbound/queue", values);
    var response = client.UploadValues("http://quickfuseapps.com/api/1/outbound/queue/", "POST", values);

    var responseString = Encoding.Default.GetString(response);
}

【问题讨论】:

  • 您应该包含您尝试过的 WebClient 代码并解释它是如何不起作用的。
  • 谢谢,我添加了一些我试过的代码。

标签: c# .net curl webclient


【解决方案1】:

这是一个发布 MultipartFormContent 和 HttpClient,而不是 WebClient 的示例。

    using (var httpClient = 
        new HttpClient(new HttpClientHandler { Credentials = new NetworkCredential { <your credentials> } }) 
    {
        var byteArrayContent =   new ByteArrayContent(<.csv bytes read>);
        byteArrayContent.Headers.ContentType = MediaTypeHeaderValue.Parse("text/csv");

        var response = await httpClient.PostAsync(_importUrl, new MultipartFormDataContent
        {
             {new StringContent(<formField1Value>), "\"<formfield1>\""},
             // more form field and values
             {byteArrayContent, "\"file\"", "\"<your file name>\""}
        });
    }

这适用于 .net 4.5。

注意 MultipartFormDataContent 中的“\”。MultipartFormDataContent 中有一个bug

在 4.5.1 中,MultipartFormDataContent 用正确的引号包裹数据。

【讨论】:

猜你喜欢
  • 2014-09-04
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
  • 2012-01-03
  • 1970-01-01
  • 1970-01-01
  • 2014-08-15
相关资源
最近更新 更多