2016-11-29 5 views
1

Я хочу отправить файл .csv в запросе POST, где тип содержимого - «multipart/form-data», а в теле есть некоторый ключ и .csv-файл Ниже приведен код, я пробовал:Как отправить файл .csv с почтовым веб-запросом в C#

string url = "*****URL*****"; 
string root = AppDomain.CurrentDomain.BaseDirectory; 
string file = root + "Folder\\file.csv"; 
FileInfo fileInfo = new FileInfo(file); 
int fileLength = (int)fileInfo.Length; 
FileStream rdr = new FileStream(file, FileMode.Open); 

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);  
request.Method = "POST"; 
request.ContentType = "multipart/form-data"; 
request.Headers["Content-Type"] = "multipart/form-data"; 

int bytesRead = 0; 
byte[] requestByte = new byte[fileLength]; 
request.ContentLength = requestByte.Length; 

using (Stream requestStream = request.GetRequestStream()) 
{ 
    while ((bytesRead = rdr.Read(requestByte, 0, requestByte.Length)) != 0) 
    { 
     requestStream.Write(requestByte, 0, bytesRead); 
     requestStream.Close(); 
    } 
} 

string responseData; 
using (StreamReader responseStream = new StreamReader(request.GetResponse().GetResponseStream())) 
{ 
    responseData = responseStream.ReadToEnd(); 
    responseStream.Close(); 
} 

Но это дает ошибку в типе контента, может быть, я делаю это неправильно. Пожалуйста, помогите мне здесь.

+1

Проверьте выбранный ответ в этом разделе: http://stackoverflow.com/questions/566462/upload-files-with-httpwebrequest-multipart-form-data –

+0

Выбранный ответ был полезен; но они использовали NameValueCollection для отправки данных файла. Где у меня есть. CSV-файл, который содержит пять полей. Итак, как мне читать данные из файла и использовать его в запросе? –

+0

Неважно. Насколько я понимаю, вы хотели загрузить файл CSV на сервер, я прав? Просто следуйте их обходному пути и используйте 'NameValueCollecttion' для отправки файла. –

ответ

0

Наконец этот код работал для меня,

string boundary = "---" + DateTime.Now.Ticks.ToString("x"); 
var client = new RestClient("*****URL*****"); 
var request = new RestRequest(Method.POST); 
request.AddHeader("content-type", "multipart/form-data; boundary=" + boundary); 
request.AddParameter("multipart/form-data; boundary=" + boundary, "--"+ boundary + "\r\nContent-Disposition: form-data; name=\"**KEY**\"; filename=\"***File Name***.csv\"\r\nContent-Type: text/csv\r\n\r\n\r\n--" + boundary + "--", ParameterType.RequestBody); 
IRestResponse response = client.Execute(request); 
+0

Вы серьезно задаете вопрос и не согласны с ним самим в двух разных сообщениях ??? Где один багги, как ад, другой - всего лишь снипп? – Dwza

+0

Извините, мистер Двза. Раньше я не проводил много исследований в Интернете и задавал вопрос. Позже я нашел решение для моего вопроса, поэтому я ответил на него. И более того, оба кода работали на меня. –

+0

но принятый код не могу работать. вы используете 'border',' nameValue', который никогда не устанавливается. Может в вашем другом посте ... но не в принятом ... и 'rand' никогда не используется. И так далее ^^ – Dwza

0

Это лучший подход:

main() 
{ 
    HttpWebRequest request; 
    HttpWebResponse response = null; 
    string url = "*****URL*****"; 
    string path = @"..\test.csv"; 
    Random rand = new Random(); 
    string contentType = "text/csv"; 
    byte[] header = RequestHeader(boundary,path,nameValue, contentType); 
    request = (HttpWebRequest)WebRequest.Create(url); 
    RequestParameters(header, path, boundary); 
    response = (HttpWebResponse)request.GetResponse(); 
} 
private byte[] RequestHeader(string boundary, string path, string nameValue, string contentType) 
{ 
    return System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\nContent-Disposition: form-data; name=\"" + nameValue + "\"; filename=\"" + System.IO.Path.GetFileName(path) + "\"\r\nContent-Type:" + contentType + "\r\n\r\n"); 
} 
private void RequestParameters(byte[] header, string path, string boundary) 
{ 
    byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n"); 
    request.Method = "post"; 
    request.KeepAlive = true; 
    request.ContentType = "multipart/form-data" + boundary; 
    data_stream = request.GetRequestStream(); 
    data_stream.Write(header, 0, header.Length); 
    byte[] file_bytes = System.IO.File.ReadAllBytes(path); 
    data_stream.Write(file_bytes, 0, file_bytes.Length); 
    data_stream.Write(trailer, 0, trailer.Length); 
    data_stream.Close(); 
} 
+0

У вас действительно много ошибок в этом коде. Вы можете исправить их, прежде чем принимать свои собственные ответы! – Dwza

 Смежные вопросы

  • Нет связанных вопросов^_^