当前位置: 首页 > 面试题库 >

WebClient上传带有POST值的UploadFile

阎志义
2023-03-14
问题内容

我想使用WebClient类将文件上传到主机。我还想传递一些应该在服务器部分(PHP)的$ _POST数组中显示的值。我想一口气做

我用过下面的代码

using (WebClient wc = new WebClient())
{
    wc.Encoding = Encoding.UTF8;
    NameValueCollection values = new NameValueCollection();
    values.Add("client", "VIP");
    values.Add("name", "John Doe"); 
    wc.QueryString = values; // this displayes in $_GET
    byte[] ans= wc.UploadFile(address, dumpPath);
}

如果我使用QueryString属性,则$ _GET数组中显示的值。但我想通过post方法发送它


问题答案:

没有内置功能可让您执行此操作。我已经在博客中发布了可以使用的扩展程序。以下是相关的类:

public class UploadFile
{
    public UploadFile()
    {
        ContentType = "application/octet-stream";
    }
    public string Name { get; set; }
    public string Filename { get; set; }
    public string ContentType { get; set; }
    public Stream Stream { get; set; }
}

public byte[] UploadFiles(string address, IEnumerable<UploadFile> files, NameValueCollection values)
{
    var request = WebRequest.Create(address);
    request.Method = "POST";
    var boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x", NumberFormatInfo.InvariantInfo);
    request.ContentType = "multipart/form-data; boundary=" + boundary;
    boundary = "--" + boundary;

    using (var requestStream = request.GetRequestStream())
    {
        // Write the values
        foreach (string name in values.Keys)
        {
            var buffer = Encoding.ASCII.GetBytes(boundary + Environment.NewLine);
            requestStream.Write(buffer, 0, buffer.Length);
            buffer = Encoding.ASCII.GetBytes(string.Format("Content-Disposition: form-data; name=\"{0}\"{1}{1}", name, Environment.NewLine));
            requestStream.Write(buffer, 0, buffer.Length);
            buffer = Encoding.UTF8.GetBytes(values[name] + Environment.NewLine);
            requestStream.Write(buffer, 0, buffer.Length);
        }

        // Write the files
        foreach (var file in files)
        {
            var buffer = Encoding.ASCII.GetBytes(boundary + Environment.NewLine);
            requestStream.Write(buffer, 0, buffer.Length);
            buffer = Encoding.UTF8.GetBytes(string.Format("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"{2}", file.Name, file.Filename, Environment.NewLine));
            requestStream.Write(buffer, 0, buffer.Length);
            buffer = Encoding.ASCII.GetBytes(string.Format("Content-Type: {0}{1}{1}", file.ContentType, Environment.NewLine));
            requestStream.Write(buffer, 0, buffer.Length);
            file.Stream.CopyTo(requestStream);
            buffer = Encoding.ASCII.GetBytes(Environment.NewLine);
            requestStream.Write(buffer, 0, buffer.Length);
        }

        var boundaryBuffer = Encoding.ASCII.GetBytes(boundary + "--");
        requestStream.Write(boundaryBuffer, 0, boundaryBuffer.Length);
    }

    using (var response = request.GetResponse())
    using (var responseStream = response.GetResponseStream())
    using (var stream = new MemoryStream())
    {
        responseStream.CopyTo(stream);
        return stream.ToArray();
    }
}

现在您可以在应用程序中使用它:

using (var stream = File.Open(dumpPath, FileMode.Open))
{
    var files = new[] 
    {
        new UploadFile
        {
            Name = "file",
            Filename = Path.GetFileName(dumpPath),
            ContentType = "text/plain",
            Stream = stream
        }
    };

    var values = new NameValueCollection
    {
        { "client", "VIP" },
        { "name", "John Doe" },
    };

    byte[] result = UploadFiles(address, files, values);
}

现在,在你的PHP脚本,你可以使用$_POST["client"]$_POST["name"]$_FILES["file"]



 类似资料:
  • 我在通过C#API中的WebClient发送POST请求时遇到问题。该职位要求如下: 我知道如何处理像用户代理等标题。,但是我对边界有一个问题。我不知道怎么把它们放在哪里...

  • 我想使用cURL不仅以HTTP POST发送数据参数,而且还上传具有特定表单名称的文件。我该怎么做呢?

  • 我想使用cURL不仅以HTTP POST发送数据参数,而且还上传具有特定名称的文件。我该怎么做呢? api还提供了如何执行curl命令的示例

  • 这是我向API发出请求的代码: 我对来自请求的响应有一个问题,它假设有一个带有json的主体,但出了问题,我认为是我在主体请求上发送的json,因为它是一个嵌套的json对象,并且键的值是一个json对象。我很想知道如何正确解析json并插入到请求体中。 这是标头响应: 假设是这样的: body响应为空,我想这是因为我在请求中发送了body,有人能帮我处理值中的嵌套json对象吗??

  • 问题内容: http://www.mkyong.com/webservices/jax-rs/file-upload-example-in- jersey/ 我正在遵循本指南并遇到问题。我有一些问题。 是否所有依赖项都必须对应?我的项目有一些org.glassfish.jersey依赖项,本指南建议使用org.sun.jersey。我是否也必须使用相同的版本进行更改? 我有这个错误 这是我的网络服

  • 所以基本上我有我的rootFolderId在我的application.properties 我需要把它放到控制器里 并在@RequestParam中使用它,例如: 但是我遇到了“属性值必须是常数”的问题。有什么方法可以让它工作吗?