智能文件API上传文件

时间:2018-06-13 13:00:01

标签: c# httpclient

我讨厌这个API .... 文档说明:

  

POST / api / 2 / path / data / Documents / HTTP / 1.1

     

内容类型:multipart / form-data

     

Content-Length:请求正文的长度

     

此处有多部分数据

所以我创造了这个:

    public async Task<bool> UploadAsync(string path, string fileName, byte[] data)
    {
        EnforceBasicAuthentication();
        var byteContent = new ByteArrayContent(data);
        byteContent.Headers.Remove("Content-Type");
        byteContent.Headers.Add("Content-Type", "multipart/form-data");
        byteContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
        {
            FileName = fileName,
            Name = "file"
        };
        var form = new MultipartFormDataContent
        {
            byteContent
        };
        var response = await _httpClient.PostAsync($"{_config.FtpUrl}/path/data/{_config.FtpPath}/{path}", form);
        response.EnsureSuccessStatusCode();
        return true;
    }

但每次我运行它时,都会收到400错误的请求错误。除此之外,它没有说什么。 看看我的代码,有什么看起来不对劲吗?

我尝试了多种解决方案,但似乎都没有。 目前我有这个:

public async Task<bool> UploadAsync(string path, string fileName, byte[] data)
{
    EnforceBasicAuthentication();

    var boundary = "--------------------------" + DateTime.Now.Ticks.ToString("x");
    var bytesContent = new ByteArrayContent(data);
    var form = new MultipartFormDataContent();

    form.Add(bytesContent, "file", fileName);
    form.Headers.Remove("Content-Type");
    form.Headers.TryAddWithoutValidation("Content-Type", $"multipart/form-data; boundary= { boundary }");
    bytesContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/octet-stream");

    var response = await _httpClient.PostAsync($"{_config.FtpUrl}/path/data/{_config.FtpPath}/{path}", form);
    response.EnsureSuccessStatusCode();
    return true;
}

但它仍然会引发400错误。 我已经配置了Fiddler并在邮递员中完成了测试。邮递员的测试工作正常。这是fiddler的请求:

  

POST https://app.smartfile.com/api/2/path/data/eOrdering/GRE017 HTTP / 1.1

     

cache-control:no-cache

     

Postman-Token:8359aae8-f4e2-4864-b81a-0169fe3f2b62

     

授权:基本的播放

     

User-Agent:PostmanRuntime / 7.1.1

     

接受: /

     

主持人:app.smartfile.com

     

cookie:csrftoken = rsDaPbfwG070rwBFlhIWVvULcAqGW0GB;

     

的sessionid = a744788776bfef3c44faf6eb5e2a2931

     

accept-encoding:gzip,deflate

     

content-type:multipart / form-data;边界= -------------------------- 606952503302468487113354

     

内容长度:334

     

连接:关闭

     

---------------------------- 606952503302468487113354

     

内容 - 处置:表单数据;命名=&#34;&#34 ;;文件名=&#34; S200-220311-20180606095501.ord&#34;

     

Content-Type:application / octet-stream

     

274 274/1 | PAULA | 00220311 | STD ||| ASAP

     

1 | 23133 | 1313 131302 4.00 | C | 3.65 ||| 12/06/18

     

---------------------------- 606952503302468487113354 -

这是我的代码生成的:

  

POST https://app.smartfile.com/api/2/path/data/eOrdering/GRE017 HTTP / 1.1

     

授权:基本等等

     

内容类型:multipart / form-data;边界= -------------------------- 8d5d140cf824278

     

主持人:app.smartfile.com

     

Cookie:csrftoken = NYOgu61I6ddqBgudQEhWNr27fJUEQFi3;

     

的sessionid = 6994ad9254ebc46e0611e6ac308d6c55

     

内容长度:375

     

- 52343329-f101-43a2-b4bb-bfa9a4073f6e

     

内容 - 处置:表单数据;名字=文件;文件名= 3c3f1596-707b-4725-9766-25faf6124a35.rsl;文件名* = UTF-8&#39;&#39; 3c3f1596-707b-4725-9766-25faf6124a35.rsl

     

Content-Type:application / octet-stream

     

失败|&#34;价格问题编号无效,必须大于0&#34; |

     

1 | 23133 | 01/01/0001 00:00:00 | 0 | 0

     

- 52343329-f101-43a2-b4bb-bfa9a4073f6e -

我仍然不知道为什么会失败:(

2 个答案:

答案 0 :(得分:1)

所以,我花了很长时间才想到这一点。 有两个问题需要解决。第一个是双 fileName (它们周围没有双引号),第二个是边界.... 最后,我将代码更改为:

public async Task<bool> UploadAsync(string path, string fileName, byte[] data)
{
    EnforceBasicAuthentication();
    var bytesContent = new ByteArrayContent(data);
    bytesContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/octet-stream");
    bytesContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
    {
        Name = "\"file\"",
        FileName = $"\"{fileName}\""
    };
    var formData = new MultipartFormDataContent { bytesContent };
    var boundary = formData.Headers.ContentType.Parameters.First(o => o.Name == "boundary");
    boundary.Value = boundary.Value.Replace("\"", string.Empty);
    var response = await _httpClient.PostAsync($"{_config.FtpUrl}/path/data/{_config.FtpPath}/{path}", formData);
    response.EnsureSuccessStatusCode();
    return true;
}

正如你在那里看到的,对于ContentDisposition我添加了名称和文件名(使用\&#34;因为一个错误....)和FormData内容类型,我不得不删除额外的双引号。

真烦人,但最后还在工作....

答案 1 :(得分:-1)

尝试将字节数据输入var content = new ByteArrayContent(filedata); 并将内容传递给PostAsync,如下所示:

var content = new ByteArrayContent(data);
var ApiRequest = client.PostAsync(apiUrl, content);