【问题标题】:Smart File API upload files智能文件 API 上传文件
【发布时间】:2018-06-13 13:00:00
【问题描述】:

我讨厌这个 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 bad request 错误。除此之外,它什么也没说。 看看我的代码,有什么看起来不对的地方吗?


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

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 并在 postman 中做了一个测试。 postman 中的测试运行良好。这是提琴手中的请求:

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

缓存控制:无缓存

邮递员令牌:8359aae8-f4e2-4864-b81a-0169fe3f2b62

授权:基本的bleh

用户代理:PostmanRuntime/7.1.1

接受:/

主机:app.smartfile.com

cookie:csrftoken=rsDaPbfwG070rwBFlhIWVvULcAqGW0GB;

sessionid=a744788776bfef3c44faf6eb5e2a2931

接受编码:gzip,放气

内容类型:多部分/表单数据;边界=--------------606952503302468487113354

内容长度:334

连接:关闭

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

内容配置:表单数据;名称="";文件名="S200-220311-20180606095501.ord"

内容类型:应用程序/八位字节流

274 274/1 |PAULA|00220311|STD|||尽快

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

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

这是我的代码生成的:

POST https://app.smartfile.com/api/2/path/data/eOrdering/GRE017HTTP/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''3c3f1596-707b-4725-9766-25faf6124a35.rsl

内容类型:应用程序/八位字节流

失败|"价格发行号无效,必须大于0"|

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

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

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

【问题讨论】:

标签: c# httpclient


【解决方案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,我添加了名称和文件名(由于存在错误......),对于FormData 内容类型,我必须删除额外的双引号.

真的很烦人,但终于工作了....

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 2022-01-27
      • 2017-02-26
      • 2014-12-31
      • 1970-01-01
      相关资源
      最近更新 更多