Rails上传文件

时间:2013-12-12 09:16:55

标签: ruby-on-rails encode

我正在使用rails 3.2.13,我需要手动上传文件(不使用回形针),然后将其转换为64。

我遇到的问题是我认为我的文件没有完整上传。

我正在尝试上传jpg。

以下是代码:表单

= form_tag send_kyc_docs_bookings_path , :multipart => true do 
              = file_field_tag :kyc_doc
              = submit_tag "Submit"

我的控制器

@encoded_file = Base64.encode64(File.open(params[:kyc_doc].tempfile,"r").read)

我得到的是 “/ 9J / 4AAQSkZJRgABAQEAtAC0AAD / 4R5kRXhpZgAASUkqAAgAAAAQAA8BAgAG \ nAAAAzgAAABABAgAVAAAA1AAAABIBAwABAAAAAQAAAA == \ n” 个

现在,如果我继续http://www.base64-image.de/step-2.php

我上传了我的文件并获得了一个像我上面开始的字符串,但却长了1000倍。

所以我发现我的文件没有完整上传,这是我的问题: 我如何完整地上传它?

如果我做的话,只是为了你的责任

File.open(params[:kyc_doc].tempfile,"r").read

我得到了

“\ XFF \ XD8 \ XFF \ xE0 \ u0000的\ u0010JFIF \ u0000的\ U0001 \ U0001 \ U0001 \ u0000的\ XB4 \ u0000的\ XB4 \ u0000的\ u0000的\ XFF \ XE1 \ u001EdExif \ u0000的\ u0000II * \ u0000的\ b \ u0000的\ u0000的\ u0000的\ u0010 \ u0000的\ u000F \ U0001 \ U0002 \ u0000的\ u0006 \ u0000的\ u0000的\ u0000的\ XCE \ u0000的\ u0000的\ u0000的\ u0010 \ U0001 \ U0002 \ u0000的\ u0015 \ u0000的\ u0000的\ u0000的\ XD4 \ u0000的\ u0000的\ u0000的\ u0012 \ U0001 \ U0003 \ u0000的\ U0001 \ u0000的\ u0000的\ u0000的\ U0001 \ u0000的\ u0000的\ u0000" 的

现在,如果我做

params[:kyc_doc].tempfile.read
我明白了 “\ XFF \ XD8 \ XFF \ xE0 \ X00 \ x10JFIF \ X00 \ X01 \ X01 \ X01 \ X00 \ XB4 \ X00 \ XB4 \ X00 \ X00 \ XFF \ XE1 \ x1EdExif \ X00 \ x00II * \ X00 \ B \ X00 \ X00 \ X00 \ X10 \ X00 \ X0F \ X01 \ X02 \ X00 \ X06 \ X00 \ X00 \ X00 \ XCE \ X00 \ X00 \ X00 \ X10 \ X01 \ X02 \ X00 \ X15 \ X00 \ X00 \ X00 \ XD4 \ X00 \ X00 \ X00 \ X12 \ X01 \ X03 \ X00 \ X01 \ X00 \ X00 \ X00 \ X01 \ X00 \ X00 \ X00 \ X1A \ X01 \ X05 \ X00 \ X01 \ X00 \ X00 \ X00 \ XEA \ X00 \ X00 \ X00。\ E \ X01 \ X05 \ X00 \ X01 \ X00 \ X00 \ X00 \ XF2 \ X00 \ X00 \ X00(\ X01 \ X03 \ X00 \ X01 \ X00 \ X00 \ X00 \ X02 \ X00 \ X00 \ X002 \ X01 \ X02 \ X00 \ X14 \ X00 \ X00 \ X00 \ XFA \ X00 \ X00 \ X00 \ X13 \ X02 \ X03 \ X00 \ X01 \ X00 \ X00 \ X00 \ X01 \ X00 \ X00 \ X00 \ X01 \ X10 \ X03 \ X00 \ X01 \ X00 \ X00 \ X00 \ X00 \ b \ X00 \ X00 \ X02 \ X10 \ X03 \ X00 \ X01 \ X00 \ X00 \ X00 \ X00 \ X06 \ X00 \ x00i \的x87 \ X04 \ X00 \ X01 \ X00 \ X00 \ X00 \ X16 \ X01 \ X00 \ X00 \ X01 \ XA4 \ X03 \ X00 \ X01 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X02 \ XA4 \ X03 \ X00 \ X01 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X03 \ XA4 \ X03 \ X00 \ X01 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X00 \ X04 \ XA4 \ X05 \ X00 \ X01 \ x00 \ x00 \ x00 \ x0E \ x01 \ x00 \ x00 \ x06 \ xA4 \ x03 \ x00 \ x01 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ xBC \ x03 \ x00 \ x00Canon \ x00Canon PowerShot A610 \ X00 \ X00 \ XB4 \ X00 \ X00 \ X00 \ X01 \ X00 \ X00 \ X00 \ XB4 \ X00 \ X00 \ X00 \ X01 \ X00 \ X00 \ x002009: 03:18 16:30:39 \ x00 \ n \ x00 \ x00 ....(1000倍以上)

然而

Base64.encode64(params[:kyc_doc].tempfile.read)

返回一个空字符串

更新:

File.open(params[:kyc_doc].tempfile,"r").size
=> 241202
>> File.open(params[:kyc_doc].tempfile,"r").read.size
=> 76

有没有人对这个问题有所了解?

由于

ANSWER

好的,所以我想出来了,事实上当你做的时候

File.open(params[:kyc_doc].tempfile,"r")

它只能看到文件的第一个caracteres(可能是因为缓冲区大小?) 所以你需要通过

遍历文档中包含的所有caracteres集
File.open(params[:kyc_doc].tempfile, "rb") {|io| io.read}

这将输出所有文档内容

现在你可以正确编码了

  

@encoded_file =   Base64.encode64(File.open(params [:kyc_doc] .tempfile,“rb”){| io |   io.read})

如果有人能更好地解释,我会很高兴听到它^^

0 个答案:

没有答案