是否可以读取文件而不将其保存在Rails中?

时间:2019-08-26 04:06:32

标签: ruby-on-rails ruby stripe-payments

我需要通过多部分API POST请求向https://files.stripe.com/v1/files提交文件,但是我不希望将此文件保存到我自己的数据库中。

条纹宝石中的

This class意味着我将编写一些类似于以下内容的代码:

Stripe::File.create({
 file: File.new("/path/to/a/file.jpg"),
 purpose: 'dispute_evidence',
})

但是由于某种原因,通过params进行操作是行不通的。我的表单是这样做的:

<%= form_for :user, url: :stripe_file_upload, multipart: true do |f| %>
 <%= f.label :drivers_license_front, "Front of driver's license" %>
 <%= f.file_field :drivers_license_front %>

 <%= f.submit "Upload", data: { disable: true } %>
<% end %>

然后控制器动作执行此操作:

def stripe_file_upload
 file = params[:user][:drivers_license_front]
 Stripe::File.create(
  { purpose: 'identity_document',
   file: file.tempfile },
  { stripe_account: current_user.stripe_user_id }
 )
 puts "file uploaded"
 redirect_to whatever_path
end

如果有帮助,我的params输出如下:

Parameters: {"utf8"=>"✓", "authenticity_token"=>"NGcXcLnY6mGGyR0SDJNj3UGSzaGrie5TrCv0vGEeasXFhXFtU6eHK10Sbr3MW5Pnax3YjDiNfo9LUi9DEwMA2g==", "user"=>{"drivers_license_front"=>#<ActionDispatch::Http::UploadedFile:0x007fb8801431e8 @tempfile=#<Tempfile:/var/folders/0p/3xq9qs1x6mv555tnlt6v9_p80000gn/T/RackMultipart20190902-38824-u77acs.png>, @original_filename="is.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"user[drivers_license_front]\"; filename=\"is.png\"\r\nContent-Type: image/png\r\n">}, "commit"=>"Upload"}

从此终端输出显示“文件已上载”消息,但是如果我去检查已上传到Stripe的文件列表,则图像不存在。我在配置中发送了Stripe API密钥,因此我将该部分留在了代码示例中。

很奇怪,我可以像在this example中那样打开一个URL,然后在控制台中提交给Stripe。这很完美。 API返回适当的JSON响应,并且图像显示在对Stripe::File.list的调用中。

为什么它可以在控制台中工作,但不能通过参数工作?我在做什么错了?

1 个答案:

答案 0 :(得分:2)

您需要向API进行身份验证才能将文件提交到Stripe,并且它只能在服务器端进行,因为您不想将凭据存储在前端代码中。

为了提交文件而不保存文件,一种解决方案是让控制器采取措施来处理提交的文件,将其上传到Stripe服务器,然后重定向到所需的任何路径:

# Init Stripe client

Stripe.api_key = STRIPE_SECRET_KEY

# Controller

def stripe_file_upload 
  file = params[:file]
  Stripe::File.create({
    file: file.tempfile,
    purpose: 'dispute_evidence'
  })
  redirect_to my_custom_path
end

# View

<h1>My Form</h1>

<%= form_tag stripe_file_upload_path, multipart: true do %>
  <%= file_field_tag :file, class: "file-input" %>
  <%= submit_tag %>
<% end %>