【问题标题】:Send files in request using JSONAPI使用 JSONAPI 在请求中发送文件
【发布时间】:2018-05-31 22:29:53
【问题描述】:

我使用 Rails 5 作为移动应用程序的后端。我要解决的问题是收到来自应用的请求,其中包含有关客户的信息以及 2 张照片。短暂接近后,出现了两个选项:

  1. 首先在 multipart/form-data POST 中发送文件,然后将 ID 返回给客户端。之后再次发送“真实”请求,服务器应将 ID(元数据)和文件关联起来。
  2. Base64.encoded 格式发送文件,无需更改 JSON 标头。比如:

    curl -X POST \
      -H "Content-Type: application/vnd.api+json" \
      -H "Cache-Control: no-cache" \
      -d '{
        "data": {
           "type": "identities",
           "attributes": {
             "param1": "first param",
             "param2": "second param",
             "image1": "data:image/png;base64,iVBORw0KGgoAAAANSU.....",
             "image2": "data:image/png;base64,iVBORw0KGgoAAAANSU....."
           }
         }' "http://API_URL/identity"
    

我对这两种方法的担忧分别是:

  1. 既然我们期望有 2 个文件,我们是否应该为每个与 ID 相关联的文件提出请求?如果第二次调用未到达服务器或无效,预计会发生什么情况?
  2. 我们应该接受多少字节?我在考虑 10MB 但我不确定这是否是个好主意以及服务器将如何反应?首先在 UI 级别(移动应用)验证文件的类型和大小是否是个好主意?

如果有人可以提出其他建议,我将不胜感激。另外,如果您对此问题有任何经验,请分享您使用过的有用参考资料,我也将不胜感激。

【问题讨论】:

  • 您是否需要严格遵守 JSON API 规范?否则,您可以将请求作为 multipart/form-data 发送,包括文件和 JSON API 文档作为另一个属性。这将允许有一个事务性请求,但不会出现由发送 base64 编码的文件和解析大约 20MB 的 JSON 所引入的性能问题。
  • 是的,我有这个要求。我还考虑将请求的大小限制为 10 MB,以免出现这些性能问题。

标签: ruby-on-rails json-api


【解决方案1】:

1) 如果您在一个请求中需要 2 个文件 - 将 2 个文件作为 multipart/form-data 传递,那完全可以。如果使用 b64,则首先对所有内容进行编码,然后对所有内容进行解码。不是最好的主意。

2) 您应该在前端和后端验证这些文件。最大字节数应该是max_file1_size + max_file_2_size + max_other_fields_size + headers_size,与其猜测不如尝试。

3) 使用 carrierwave 将是一个不错的选择 - 不错的宝石,而且你的空间会少很多:)

【讨论】:

  • 我删除了carrierwave 选项,因为它看起来主要用于上传及其本身和实际存储。不过,谢谢你的回答!
猜你喜欢
  • 1970-01-01
  • 2014-08-29
  • 2019-01-13
  • 1970-01-01
  • 2021-10-22
  • 2019-12-13
  • 1970-01-01
  • 2018-03-27
  • 1970-01-01
相关资源
最近更新 更多