Загрузка локального файла POST-запросом

arg0n

Client
Регистрация
03.03.2015
Сообщения
7
Благодарностей
3
Баллы
3
Работаю через апи, дошел до загрузки файла, но т.к. с пост\гет ранее не дружил прошу помочь.

Есть пост-запрос:
Код:
<...>
Content-Length: 1941255
<...>
--boundary
Content-Type: video/x-msvideo
Content-Transfer-Encoding: binary

<Binary File Data>
--boundary--
Вопрос в том, как подцепить файл в двоичном коде и как посчитать побайтовую длину всего запроса?
Направьте на путь истины.
 

KirillOFF

Client
Регистрация
18.12.2010
Сообщения
1 127
Благодарностей
517
Баллы
113
Сниппеты в помощь. Длину считать самому не надо, этот заголовок сам установится.
 
  • Спасибо
Реакции: LightWood и arg0n

arg0n

Client
Регистрация
03.03.2015
Сообщения
7
Благодарностей
3
Баллы
3
Набросал такой сниппет:
Код:
byte[] fileBytes = File.ReadAllBytes(@"C:\in.avi");
StringBuilder sb = new StringBuilder();
foreach(byte b in fileBytes)
{
    sb.Append(Convert.ToString(b, 2)); 
}

File.WriteAllText(@"C:\out.txt", sb.ToString());
Не пинайте за вывод в файл. На выходе получил такой запрос (конец):
Код:
<..тело..>
--f93dcbA3
Content-Type: video/x-msvideo
Content-Transfer-Encoding: binary

10100101001001100011<..много двоичного кода..>100011000011110110101011110100101011000000
--f93dcbA3--
Но в ответе всё также No file found in request.
 
  • Спасибо
Реакции: LightWood

LexxWork

Client
Регистрация
31.10.2013
Сообщения
1 190
Благодарностей
786
Баллы
113
Код:
string url = "http://localhost:8888"; //урл
string file = @"D:\Zen\_scripts\очистка_текста.xmlz"; //файл
string paramName = "video"; //название парамерта для файла
string contentType = "video/x-msvideo"; //тип данных
var nvc = new System.Collections.Specialized.NameValueCollection(); //дополнительные поля
/////////////////////////////////////////////////////////////////////////////////////////

string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
byte[] boundarybytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");

var wr = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
wr.UserAgent = project.Profile.UserAgent;
wr.Accept = "*/*";
wr.ContentType = "multipart/form-data; boundary=" + boundary;
wr.Method = "POST";
wr.KeepAlive = true;
wr.Credentials = System.Net.CredentialCache.DefaultCredentials;
wr.KeepAlive = false;

var rs = wr.GetRequestStream();

string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
foreach (string key in nvc.Keys)
{
    rs.Write(boundarybytes, 0, boundarybytes.Length);
    string formitem = string.Format(formdataTemplate, key, nvc[key]);
    byte[] formitembytes = Encoding.UTF8.GetBytes(formitem);
    rs.Write(formitembytes, 0, formitembytes.Length);
}
rs.Write(boundarybytes, 0, boundarybytes.Length);

string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\nContent-Transfer-Encoding: binary\r\n\r\n";
string header = string.Format(headerTemplate, paramName, file, contentType);
byte[] headerbytes = Encoding.UTF8.GetBytes(header);
rs.Write(headerbytes, 0, headerbytes.Length);

var fileStream = new System.IO.FileStream(file, FileMode.Open, FileAccess.Read);
byte[] buffer = new byte[4096];
int bytesRead = 0;
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0) {
    rs.Write(buffer, 0, bytesRead);
}
fileStream.Close();

byte[] trailer = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
rs.Write(trailer, 0, trailer.Length);
rs.Close();

System.Net.WebResponse wresp = null;
try {
    wresp = wr.GetResponse();
    Stream stream2 = wresp.GetResponseStream();
    StreamReader reader2 = new StreamReader(stream2);
    project.SendInfoToLog(string.Format("File uploaded, server response is: {0}", reader2.ReadToEnd()));
} catch(Exception ex) {
    project.SendErrorToLog("Error uploading file " + ex.Message);
    if(wresp != null) {
        wresp.Close();
        wresp = null;
    }
} finally {
    wr = null;
}
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)