我需要通过多部分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
的调用中。
为什么它可以在控制台中工作,但不能通过参数工作?我在做什么错了?
答案 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 %>