2015-02-14 3 views
0

Я обрабатываю процесс http-сообщения, используя HttpWebRequest в asp.net mvc.Как имитировать процесс загрузки файла после отправки по электронной почте?

В принципе, если сообщение Http успешно, оно будет записывать все значение post в базу данных или файл.

Он хорошо работает с простыми типами, такими как строки, int, datetime. Но я не знаю, как создать строку запроса из изображения или другие файлы, такие как .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, но я думаю, что этот процесс не будет работать в сети страница не знала, где находится изображение. Итак, любые идеи использовать фиктивный Url для поиска изображения или любого файла, чтобы я мог преобразовать его в массив байтов и манипулировать им?

ответ

1

Вы можете использовать кодировку base64 для преобразования двоичных данных в строку и затем поместить ее в строку запроса, но ее не рекомендуется. Для отправки двоичных данных лучше использовать метод post и его данные в вашем HTTP-запросе.

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) 
    { 
     // ... 
    } 
} 
Смежные вопросы