通过API使用Activestorage(直接上传)

时间:2018-04-06 09:00:57

标签: ruby-on-rails rails-activestorage

我想将Rails用作移动应用(Android和iOS)的后端,其中一个要求是文件上传。

我还没有找到任何使用Activestorage直接上传的资源 - 有没有人有例子或提示?

另一种选择 - 我认为 - 是对activestorage.js进行反向工程,并完成其所做的工作。但也许我不是第一个有此需求的人......

1 个答案:

答案 0 :(得分:-1)

我使用rails作为后端,但我使用多态文档模型进行文档上传。最近我将paperclip api转换为文档模型的主动存储。以下链接介绍了如何将活动存储作为后端上传与base64编码和解码集成。

Active Storage as Attachment in Rails API with base64 decoding

这成为我的文档模型,具有活动存储库64解码多态:

class Document < ApplicationRecord
  has_one_attached :doc
  belongs_to :documentable, polymorphic: true, optional: true
  attr_accessor :doc_contents
  attr_accessor :doc_name

after_create :parse_doc validate :doc_validations, on: :create

def parse_doc # If directly uploaded unless self.doc_contents.nil? || self.doc_contents[/(image/[a-z]{3,4})|(application/[a-z]{3,4})/] == '' content_type = self.doc_contents[/(image/[a-z]{3,4})|(application/[a-z]{3,4})/] content_type = content_type[/\b(?!./)./] contents = self.doc_contents.sub /data:((image|application)/.{3,}),/, '' decoded_data = Base64.decode64(contents) filename = self.doc_name || 'doc_' + Time.zone.now.to_s + '.' + content_type File.open("#{Rails.root}/tmp/images/#{filename}", 'wb') do |f| f.write(decoded_data) end self.doc.attach(io: File.open("#{Rails.root}/tmp/images/#{filename}"), filename: filename) FileUtils.rm("#{Rails.root}/tmp/images/#{filename}") end end

private

def doc_validations if self.doc_contents.nil? errors.add(:base, I18n.t('errors.documents.file_required')) end end end