rails-activestorage - Rails 5.2 Rest API + Active Storage - 上传从外部服务接收的文件 blob
问题描述
我们正在接收来自外部服务的 POST 调用,其中包含文件 blob(采用 Base64 编码)和一些其他参数。
# POST call to /document/:id/document_data
param = {
file: <base64 encoded file blob>
}
我们希望处理文件并将其上传到以下模型
# MODELS
# document.rb
class Document < ApplicationRecord
has_one_attached :file
end
解决方案
在处理 POST 调用的 Controller 方法中
# documents_controller.rb - this method handles POST calls on /document/:id/document_data
def document_data
# Process the file, decode the base64 encoded file
@decoded_file = Base64.decode64(params["file"])
@filename = "document_data.pdf" # this will be used to create a tmpfile and also, while setting the filename to attachment
@tmp_file = Tempfile.new(@filename) # When a Tempfile object is garbage collected, or when the Ruby interpreter exits, its associated temporary file is automatically deleted.
@tmp_file.binmode # This helps writing the file in binary mode.
@tmp_file.write @decoded_file
@tmp_file.rewind()
# We create a new model instance
@document = Document.new
@document.file.attach(io: @tmp_file, filename: @filename) # attach the created in-memory file, using the filename defined above
@document.save
@tmp_file.unlink # deletes the temp file
end
希望这可以帮助。
更多关于 Tempfile 的信息可以在这里找到。
推荐阅读
- python-3.x - 发送串行数据时程序卡住
- mysql - MySQL中模式的概念
- node.js - AWS DynamoDB 中的嵌套数组过滤器
- java - 使用输出目录 -o 选项时,TestRig / grun 会丢弃 java.lang.NoClassDefFoundError
- swiftui - 如何解决错误:xcode12 和 swiftui 中的“不能在不可变值上使用变异成员:'users' 是 get-only 属性”
- python - 计算字典的在线人数
- python - 使用 Keras/Tensorflow 数据加载器高效加载大型 .npy 文件 (>20GB)
- solr - SOLR 4.1.0 - 字段之间的日期查询
- c++ - 渲染OpenGL后屏幕上什么都没有
- markdown - 将 gif 添加到降价文件