【问题标题】:How to simulate a http post file upload process?如何模拟一个http post文件上传过程?
【发布时间】:2015-04-15 06:32:10
【问题描述】:

我在 asp.net mvc 中使用 HttpWebRequest 自动执行 http post 的过程。

基本上如果Http post成功,它会将所有post值写入数据库或文件中。

它适用于简单的类型,如字符串、int、日期时间。但我不确定如何从图像或其他文件(例如.doc.pdf...

手动上传文件时,文件的输入值为UploadedFile:****.JPG;选择本地文件后,对于http post我可以做

string mimeType = Request.Files[upload].ContentType;
Stream fileStream = Request.Files[upload].InputStream;
string fileName = Path.GetFileName(Request.Files[upload].FileName);
int fileLength = Request.Files[upload].ContentLength;
byte[] fileData = new byte[fileLength];
fileStream.Read(fileData, 0, fileLength);
...

但我正在进行自动化操作,所以我想我需要一个类似field1=value1&field2=value2&UploadedFile=****.JPG 的查询字符串;但我认为该过程无法正常工作,因为网页不知道图像在哪里。那么有什么想法可以使用 phicical Url 来定位图像或任何文件,以便我可以将其转换为字节数组并对其进行操作?

【问题讨论】:

    标签: asp.net-mvc http-post


    【解决方案1】:

    您可以使用base64 编码将二进制数据转换为字符串,然后将其放入查询字符串中,但不建议这样做。要发送二进制数据,最好在 http 请求中使用 post 方法及其数据。

    like this,或^^^

    和代码:

    public void PostMultipleFiles(string url, string[] files)
    {
        string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x");
        HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
        httpWebRequest.ContentType = "multipart/form-data; boundary=" + boundary;
        httpWebRequest.Method = "POST";
        httpWebRequest.KeepAlive = true;
        httpWebRequest.Credentials = System.Net.CredentialCache.DefaultCredentials;
        using(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}";
            string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n Content-Type: application/octet-stream\r\n\r\n";
            memStream.Write(boundarybytes, 0, boundarybytes.Length);
            for (int i = 0; i < files.Length; i++)
            {
                string header = string.Format(headerTemplate, "file" + i, files[i]);
                //string header = string.Format(headerTemplate, "uplTheFile", files[i]);
                byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
                memStream.Write(headerbytes, 0, headerbytes.Length);
                using(FileStream fileStream = new FileStream(files[i], 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);
                }
            }
            httpWebRequest.ContentLength = memStream.Length;
            using(Stream requestStream = httpWebRequest.GetRequestStream())
            {
                memStream.Position = 0;
                byte[] tempBuffer = new byte[memStream.Length];
                memStream.Read(tempBuffer, 0, tempBuffer.Length);
                requestStream.Write(tempBuffer, 0, tempBuffer.Length);
            }
        }
        try
        {
            WebResponse webResponse = httpWebRequest.GetResponse();
            Stream stream = webResponse.GetResponseStream();
            StreamReader reader = new StreamReader(stream);
            string var = reader.ReadToEnd();
        }
        catch (Exception ex)
        {
            // ...
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-28
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      • 2012-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多