【问题标题】:Uploading a file using the Backblaze B2 API with OpenFeign使用带有 OpenFeign 的 Backblaze B2 API 上传文件
【发布时间】:2022-07-12 01:17:12
【问题描述】:

我正在使用带有 OpenFeign 的 Spring Boot,并且我正在尝试将文件上传到 Backblaze B2。

我已经有 b2_authorize_accountb2_get_upload_url 端点工作。现在我正在尝试向b2_upload_file 发送请求。

我对 Feign 客户端请求的代码是

@PostMapping()
String b2UploadFile(URI uri,
                    @RequestHeader("Authorization")     String uploadUrlToken,
                    @RequestHeader("X-Bz-File-Name")    String fileName,
                    @RequestHeader("Content/Type")      String contentType,
                    @RequestHeader("X-Bz-Content-Sha1") String contentSha1,
                    byte[] file);

当我执行代码时,我得到一个java.net.SocketException: Connection reset 异常。我认为服务器正在关闭连接。

我使用 Postman 测试了端点并且它工作正常,我能够上传我的文件。

我应用了相同的标头和值,Postman 和 OpenFeign 之间的区别在于,在 Postman 中我点击了 Body -> 二进制 -> 上传文件,而在 OpenFeign 中我使用 byte[] 传递文件,没有任何注释。

在 API 文档中,它还说我需要 Content-Length 标头,但是当我将它包含在 OpenFeign 中时,我遇到了数字格式异常。我无法解决它,但根据我读过的内容,OpenFeign 应该会自动执行此操作。我也没有在 Postman 中包含标题,它仍然可以工作,因为 Postman 默认也包含它,所以我认为这不是问题。

我尝试用@RequestBody byte[] file注释文件,使其成为一个多部分文件,使用文件类型,使用字符串类型,使用输出流和输入流。

API 说:

不允许使用 JSON 参数。要上传的文件是消息体,不以任何方式编码。它不是 URL 编码的。它不是 MIME 编码的。

【问题讨论】:

    标签: java spring spring-boot openfeign backblaze


    【解决方案1】:

    来自 cmets 的讨论

    OpenFeign 不允许你直接设置 Content-Type 标头,所以你必须指定:

    @PostMapping(consumes = "b2/x-auto", produces = "application/json")
    

    原答案:

    在您发布的代码中,

    @RequestHeader("Content/Type")      String contentType,
    

    应该是

    @RequestHeader("Content-Type")      String contentType,
    

    【讨论】:

    • 我最初有 Content-Type 但我一直收到错误 Invalid mime type "{Content-Type}": does not contain '/' 传递给评论类型的值确实包含 / 所以我唯一能想到的另一件事就是在内容中用 / 替换-type 并且错误消失了。
    • 看了你的建议后,我回去调查了 Content-Type ,结果发现用 Accept 替换它就可以了!谢谢。编辑:上传工作正常,但似乎 Backblaze 现在没有选择正确的内容类型并默认为“application/octet-stream”
    • 这很奇怪。接受是您希望在响应中看到的内容,即application/json。你现在设置什么内容类型?你上传的是什么类型的数据? X-Bz-File-Name 文件名是否有扩展名?
    • 我删除了 Accept 所以现在我只有三个标题 Authorization X-Bz-File-NameX-Bz-Content-Sha1 并且它仍在上传。我认为 open feign 会自动放置内容类型,并在我传入时忽略 Accept。我正在上传 PNG 文件,文件名确实包含 .png 扩展名。该文件作为 Multipart 文件发送到控制器,然后我对其执行 .getBytes() 。我还尝试先保存它,通过 BufferedImage 加载它并以这种方式获取字节。我尝试value = HttpHeaders.CONTENT_TYPE作为标题并传入image/png但仍然得到错误
    • 非常感谢您的网站!我看到使用您发送给我的网站仍然出现 Content-Type 错误,所以我返回并添加了 @PostMapping(consumes = "b2/x-auto", produces = "application/json") 。现在上传工作正常,并且基于扩展在 backblaze 上设置了正确的内容类型。当您直接使用 Content-Type 时,似乎有一些与 open feign 有关的东西。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多