是否有任何类、库或代码可以帮助我上传HTTPWebrequest个文件?

Edit 2:

我不想上传到WebDAV文件夹或类似的文件夹.我想模拟一个浏览器,所以就像你上传你的头像到论坛,或者通过Web应用程序中的表单上传文件一样.上载到使用多部分/表单数据的表单.

Edit:

WebClient不能满足我的需求,所以我在寻找HTTPWebrequest个的解决方案.

推荐答案

我在寻找这样的东西,发现于:

public static string UploadFilesToRemoteUrl(string url, string[] files, NameValueCollection formFields = null)
{
    string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x");

    HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url);
    request.ContentType = "multipart/form-data; boundary=" +
                            boundary;
    request.Method = "POST";
    request.KeepAlive = true;

    Stream memStream = new System.IO.MemoryStream();

    var boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" +
                                                            boundary + "\r\n");
    var endBoundaryBytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" +
                                                                boundary + "--");


    string formdataTemplate = "\r\n--" + boundary +
                                "\r\nContent-Disposition: form-data; name=\"{0}\";\r\n\r\n{1}";

    if (formFields != null)
    {
        foreach (string key in formFields.Keys)
        {
            string formitem = string.Format(formdataTemplate, key, formFields[key]);
            byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);
            memStream.Write(formitembytes, 0, formitembytes.Length);
        }
    }

    string headerTemplate =
        "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n" +
        "Content-Type: application/octet-stream\r\n\r\n";

    for (int i = 0; i < files.Length; i++)
    {
        memStream.Write(boundarybytes, 0, boundarybytes.Length);
        var header = string.Format(headerTemplate, "uplTheFile", files[i]);
        var headerbytes = System.Text.Encoding.UTF8.GetBytes(header);

        memStream.Write(headerbytes, 0, headerbytes.Length);

        using (var fileStream = new FileStream(files[i], FileMode.Open, FileAccess.Read))
        {
            var buffer = new byte[1024];
            var bytesRead = 0;
            while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
            {
                memStream.Write(buffer, 0, bytesRead);
            }
        }
    }

    memStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);
    request.ContentLength = memStream.Length;

    using (Stream requestStream = request.GetRequestStream())
    {
        memStream.Position = 0;
        byte[] tempBuffer = new byte[memStream.Length];
        memStream.Read(tempBuffer, 0, tempBuffer.Length);
        memStream.Close();
        requestStream.Write(tempBuffer, 0, tempBuffer.Length);
    }

    using (var response = request.GetResponse())
    {
        Stream stream2 = response.GetResponseStream();
        StreamReader reader2 = new StreamReader(stream2);
        return reader2.ReadToEnd();
    }
}

.net相关问答推荐

更改列表中的值

.NET 4.5 项目未在 Visual Studio 2022 中编译

StreamWriter.Flush() 和 StreamWriter.Close() 有什么区别?

为什么 .NET 内部 Hashtable 中有一个 Thread.Sleep(1)?

JavaScript 中的IsNullOrWhitespace?

AutoMapper 的替代品

您是否使用 TestInitialize 或测试类构造函数来准备每个测试?为什么?

在 Moq 中模拟泛型方法而不指定 T

IIS Express - 500.19 无法读取配置文件 - 因为它正在查看错误的路径

简单委托(委托)与多播委托

图像与位图类

什么是 project.lock.json?

WCF服务客户端:内容类型text/html;响应消息的charset=utf-8 与绑定的内容类型不匹配

在同一解决方案中引用 2 个不同版本的 log4net

当我们按下 Enter 键时启动的 WPF 文本框命令

强制 XmlSerializer 将 DateTime 序列化为 'YYYY-MM-DD hh:mm:ss'

List 是否保证项目将按照添加的顺序返回?

使 HashSet 不区分大小写

如何在不使用 3rd 方库的情况下登录 C#?

如何在 C# 中使用迭代器反向读取文本文件