2015-11-11 47 views
1

Im使用unirest在Node JS中創建客戶端API,該API將向Rails API發送數據。我必須將文件變成編碼字符串這樣的base64:Rails API carrierwave無法上傳從API客戶端發送的文件

unirest.post('http://localhost:3000/api/v1/image_uploaders') 
.headers({'Content-Type': 'multipart/form-data'}) 
.field({ 
    "product_id": 12, 
    "variant_id": 1, 
    "image": fs.readFileSync(path).toString('base64') 
}) // Form field 
.end(function (response) { 
    console.log(response.body); 
}); 

在Rails的側面這就是處理請求:

def create 
    variant = Variant.where(id: params[:variant_id]).first 

    if variant 
    product_image = ProductImage.new 
    product_image.image = StringIO.new(Base64.decode64(params[:image])) 
    product_image.product_id = params[:product_id] 
    product_image.variant_id = params[:variant_id] 

    if product_image.save 
     render json: true, status: :ok 
    else 
     render json: false, status: :bad_request 
    end 
    else 
    render json: false, status: :bad_request 
    end 
end 

我沒有得到文件上傳。任何想法?謝謝。

UPDATE

我得到這個錯誤信息:

undefined method `unpack' 
for #<ActionDispatch::Http::UploadedFile:0x007fe47ac26f80> 

這點這一行:

product_image.image = StringIO.new(Base64.decode64(params[:image])) 
+0

當您嘗試保存數據庫時顯示日誌。 – MC2DX

+0

@MateuszCzerwiński請參閱我更新的問題 – kmp4hj

+0

嘗試不使用'Base64.decode64',也許可以將數據存儲爲base64(?)。 – MC2DX

回答

0

您可以使用下面的寶石使用base64編碼字符串carrierwave :

https://github.com/lebedev-yury/carrierwave-base64

你只需要改變mount_uploadermount_base64_uploaderProductImage類,然後你可以指定base64編碼字符串,你像場:

product_image = ProductImage.new(params) 
0

解決它。

我改變:

"image": fs.readFileSync(path).toString('base64') 

到:

"image": fs.createReadStream(path) 

與沒有必要對文件進行解碼。謝謝大家

相關問題