C # Двоичный файл отправлять запрос - PullRequest
0 голосов
/ 22 октября 2019

Я имею дело со сторонним API, который настаивает на том, чтобы двоичный запрос на загрузку файла был отформатирован без Content-Type значения заголовка multipart/form-data и со следующими заголовками:

Content-Type: application/octet-stream
Content-Disposition: filename*=UTF-8''file.zip

HttpRequestMessage и HttpContent.Headers.ContentDisposition.DispositionType не позволят мне достичь этого либо потому, что я не могу установить требуемые значения, либо они устанавливаются автоматически.

Я принимаю, что этот API не можетследовать стандартам HTTP, но это не мое, и я не имею на это никакого влияния.

Моя попытка, которая не работает

    using (HttpClient client = new HttpClient())
    {
        client.DefaultRequestHeaders.ExpectContinue = false;
        FileStream fs = new FileStream(@"e:\dev\TestHalfB.docx", FileMode.Open);

        HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Post, <Uri>);
        HttpContent fc = new StreamContent(fs);
        var mpContent = new MultipartFormDataContent();
        mpContent.Add(fc);
        fc.Headers.ContentType = MediaTypeHeaderValue.Parse("application/octet-stream");
        req.Content = fc;
        fc.Headers.ContentDisposition.DispositionType = "filename*=UTF-8''TestHalfB.docx";

        using (var response = await client.SendAsync(req))
        {
            response.EnsureSuccessStatusCode();
            var resp = await response.Content.ReadAsStringAsync();
        }

        fs.Close();
    }

Кто-нибудь знает о API более низкого уровня, который я мог бы использовать или иметь? какие-нибудь предложения?

Итак, суть в том, как мне установить заголовок Content-Disposition на желаемое значение.

Ответы [ 3 ]

0 голосов
/ 22 октября 2019

Это должно сработать для вас (или, по крайней мере, для начала, так как оно не проверено):

HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Post, <Uri>);
using (FileStream fs = new FileStream(@"e:\dev\TestHalfB.docx", FileMode.Open))
{
    byte[] fb = new byte[(int)fs.Length]; // assumes your file size will fit into an int
    await fs.ReadAsync(fb, 0, (int)fs.Length);
    req.Content = new ByteArrayContent(fb);
    req.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/octet-stream");
    req.Content.Headers.ContentDisposition.FileNameStar = "UTF-8''TestHalfB.docx";

    using (var response = await client.SendAsync(req))
    {
        response.EnsureSuccessStatusCode();
        var resp = await response.Content.ReadAsStringAsync();
    }
}
0 голосов
/ 23 октября 2019

Мне пришлось перейти на использование WebRequest.

    WebRequest request = WebRequest.Create("https://cloud.memsource.com/web/api2/v1/projects/{id}/jobs?token={token}");
    request.Method = "POST";
    byte[] byteArray = File.ReadAllBytes(@"E:\Dev\TestHalfB.docx");
    request.ContentType = "application/octet-stream";
    request.ContentLength = byteArray.Length;
    request.Headers.Add("Content-Disposition", "filename*=UTF-8''TestHalfB.docx");
    Stream dataStream = request.GetRequestStream();
    dataStream.Write(byteArray, 0, byteArray.Length);
    dataStream.Close();
    WebResponse response = request.GetResponse();
    ((HttpWebResponse)response).StatusDescription.Dump();
0 голосов
/ 22 октября 2019

Не могли бы вы попробовать это.

   HttpContent fileStreamContent = new StreamContent(paramFileStream);

    using (var formData = new MultipartFormDataContent())
    {
        formData.Add(fileStreamContent, "file1", "file1");
        var response = client.PostAsync(actionUrl, formData).Result;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...