Перевести cURL на c # или VB.net

1

Мне не удалось загрузить файл в cloud.seafile.com с моим кодом.

Строка cURL в ссылке:

curl -H "Authorization: Token 6a3ff5c8c2127baf8e1d94d928acc477f72a9519" -F file=@"C:\vcredist.bmp" -F filename=vcredist.bmp -F parent_dir=/ https://cloud.seafile.com/seafhttp/upload-api/26af9fe1

С cURL работает отлично.

Я пробовал много разных подходов с System.Net.WebClient или HttpResponse, но ничего не работает.

Теги:
curl
httpresponse
webclient

3 ответа

1

В соответствии с запросом, код заставляет ссылку удаляться (вам нужно 10K+ rep, чтобы посмотреть, если это так). Код специфичен для данных multipart/form с границей (в соответствии с вашим -v)

public static void HttpUploadFile(string url, string file, string paramName, string contentType, NameValueCollection nvc) {
    log.Debug(string.Format("Uploading {0} to {1}", file, url));
    string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
    byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");

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

    Stream 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 = System.Text.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\n\r\n";
    string header = string.Format(headerTemplate, paramName, file, contentType);
    byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
    rs.Write(headerbytes, 0, headerbytes.Length);

    FileStream fileStream = new 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 = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
    rs.Write(trailer, 0, trailer.Length);
    rs.Close();

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

а затем использование:

NameValueCollection nvc = new NameValueCollection();
nvc.Add("id", "TTR");
nvc.Add("btn-submit-photo", "Upload");
HttpUploadFile("http://your.server.com/upload", 
     @"C:\test\test.jpg", "file", "image/jpeg", nvc);
0

Я пытался загрузить файлы в облачный сервис Seafile. Я уже пытаюсь использовать функцию HttpUploadFile. Необработанный запрос, снятый с помощью скрипача, идентичен cURL, но по какой-то причине он не работает.

Я решил включить curl.exe в мой проект, запуская его таким образом:

 Dim pInfo As New ProcessStartInfo(cURLPath, "-H ""Authorization: Token " & Token & """ -F file=@""" & FilePathToUpload & """ -F filename=" & FileNameToUpload & " -F parent_dir=/ " & UploadURL)
 pInfo.WindowStyle = ProcessWindowStyle.Hidden
 pInfo.UseShellExecute = False
 Process.Start(pInfo)
0

То, что вы ищете, рассматривается в этом вопросе

Вам нужно будет добавить аутентификацию к запросу через HTTP-заголовок Authorization:

req.Headers.Add("Authorization", auth);
  • 0
    Я включил заголовок авторизации.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню