【发布时间】:2021-09-25 08:31:22
【问题描述】:
我正在尝试使用 Drive API 上传文件。
使用这个:https://developers.google.com/drive/api/v3/manage-uploads
我的代码
这是我的代码:
url = URI.parse("https://www.googleapis.com/upload/drive/v3/files")
url.query = "uploadType=multipart"
req = Net::HTTP::Post.new(url.path)
request_header.each{ |key, value| req[key.to_s] = value }
filedata = [ "file", file, { filename: "Untitle.png", content_type: "image/png" } ]
metadata = [ "metadata", '{"name": "test.png"}', { filaneme: "", content_type: "application/json" } ]
data = [filedata, metadata]
req.set_form(data, "multipart/form-data")
http.request(req)
而且效果很好。图片(Untitle.png)以“test.png”的形式上传到云端硬盘。
问题
然而,HTML5 官方表示非文件字段(i.d. 元数据)不能有 content_type 作为可选哈希。
生成的 multipart/form-data 资源中与非文件字段对应的部分不得指定 Content-Type 标头。
https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#multipart-form-data
我们可以看到 ruby 中的 set_form(encode_multipart_form_data) 是遵循这个规则的。 https://apidock.com/ruby/v2_5_5/Net/HTTPGenericRequest/encode_multipart_form_data
由于元数据是非文件字段且文件名不存在,我的代码应该是这样的:
filedata = [ "file", file, { filename: "Untitle.png", content_type: "image/png" } ]
metadata = [ "metadata", '{"name": "test.png"}' ]
data = [filedata, metadata]
req.set_form(data, "multipart/form-data")
http.request(req)
在这里,我减少了内容类型选项。
但是,此代码不能完美运行。文件(Untitle.png)已上传,但文件名是“Untitle.png”,而不是元数据中指定的“test.png”。
我知道我可以像这样将元数据设置为 json 文件。 但在这种情况下不想将元数据指定为文件。
有没有更好的方法来做到这一点? 我不能使用任何宝石。
【问题讨论】:
-
如果你还没有准备好自己动手,谷歌提供了一个用于此 API 的宝石。 github.com/googleapis/…
标签: ruby-on-rails ruby google-drive-api