使用其他模型自动上传文件

时间:2013-04-17 22:15:59

标签: c# automation httpwebrequest

我有以下MVC 4动作

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SendAttachment(SomeViewModel model, HttpPostedFileBase attachment)
{
    // implementation goes here
}

现在我想通过使用HttpWebRequest API将控制台应用程序中的文件上传到此控制器操作,但我无法弄清楚如何在我的帖子中设置模型和文件数据,以便与控制器匹配。

有关于此的任何提示吗?

1 个答案:

答案 0 :(得分:3)

我针对您的问题进行了一些功能更改(Upload files with HTTPWebrequest (multipart/form-data))。它对我有用。 试试这样:

服务器端

    [HttpPost]
    public ActionResult SendAttachment(SomeViewModel model, HttpPostedFileBase attachment)
    {
        return View();
    }

    public class SomeViewModel  
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

在控制台应用中

static void Main(string[] args)
    {
        UploadData(
            "http://dissertation.lan/Home/SendAttachment",
            new NameValueCollection()
            { 
                {"attachment", @"C:\Users\_____\Desktop\YourFile.xltx"}
            },
            new NameValueCollection() 
            {
                {"Id", "2"},
                {"Name","Man"}
            });
    }

    public static void UploadData(string url, NameValueCollection files, NameValueCollection nvc)
    {
        string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x");

        HttpWebRequest httpWebRequest2 = (HttpWebRequest)WebRequest.Create(url);
        httpWebRequest2.ContentType = "multipart/form-data; boundary=" + boundary;
        httpWebRequest2.Method = "POST";
        httpWebRequest2.KeepAlive = true;
        httpWebRequest2.Credentials = System.Net.CredentialCache.DefaultCredentials;

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

        byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" +
        boundary + "\r\n");

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

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

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

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

        foreach (string key in files.Keys)
        {
            string header = string.Format(headerTemplate, key, files[key]);
            byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
            memStream.Write(headerbytes, 0, headerbytes.Length);

            FileStream fileStream = new FileStream(files[key], FileMode.Open,
            FileAccess.Read);
            byte[] buffer = new byte[1024];
            int bytesRead = 0;

            while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
            {
                memStream.Write(buffer, 0, bytesRead);
            }

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

            fileStream.Close();
        }

        httpWebRequest2.ContentLength = memStream.Length;

        Stream requestStream = httpWebRequest2.GetRequestStream();

        memStream.Position = 0;
        byte[] tempBuffer = new byte[memStream.Length];
        memStream.Read(tempBuffer, 0, tempBuffer.Length);
        memStream.Close();
        requestStream.Write(tempBuffer, 0, tempBuffer.Length);
        requestStream.Close();

        WebResponse webResponse2 = httpWebRequest2.GetResponse();

        Stream stream2 = webResponse2.GetResponseStream();
        StreamReader reader2 = new StreamReader(stream2);

        Console.Write(reader2.ReadToEnd());

        webResponse2.Close();
        httpWebRequest2 = null;
        webResponse2 = null;
    }

<强>结果 enter image description here

enter image description here