Rails Rails 自定义图片上传问题解决小记

lonely21475 · November 15, 2014 · Last by zhengxl replied at June 22, 2016 · 4257 hits

最近在做一个自己的项目,在图片上传的时候,如果用系统的如


<%= form_for(@embarrass) do |f| %>
   <%= f.file_field :picture %>
<% end%>

就可以获取到上传文件的相关属性

但是,为了界面更适合自己的操作习惯,做了自定义 form 提交

<form action="/embarrasses" method="post" accept-charset="utf-8">
    <h3>图片:</h3>
    <input type="file" id="imgInp" name="embarrass[picture]"  size="19" style="opacity: 0;" accept=".jpg,.gif,.png,.jpeg">
</form>

就只能获取上传文件的名称,其他属性无法获取 如果遇到文件上传,自定义表单时,要设置 表单 的 MIME 格式,这样才能将文件所有属性上传成功

<form action="/embarrasses" method="post" accept-charset="utf-8" enctype="multipart/form-data">
    <h3>图片:</h3>
    <input type="file" id="imgInp" name="embarrass[picture]"  size="19" style="opacity: 0;" accept=".jpg,.gif,.png,.jpeg">
</form>

在 model 里,定义文件上传的方法

#encoding=utf-8
require 'rack/auth/digest/md5'

class Embarrass < ActiveRecord::Base

  def Embarrass.picture_upload(file)
    dir_path = "#{Rails.root}/public/images/embarrass/#{Time.now.strftime('%Y%m')}"
    if !File.exist?(dir_path)
      FileUtils.makedirs(dir_path)
    end
    file_rename = "#{Digest::MD5.hexdigest(Time.now.to_s)}#{File.extname(file.original_filename)}"
    file_path = "#{dir_path}/#{file_rename}"
    File.open(file_path,'wb+') do |item| #用二进制对文件进行写入
      item.write(file.read)
    end
    store_path = "/images/embarrass/#{Time.now.strftime('%Y%m')}/#{file_rename}"
    return store_path
  end

  def Embarrass.delete_picture(picture_path)
    file_path = "#{Rails.root}/public/#{picture_path}"
    if File.exist?(file_path)
      File.delete(file_path)
    end
  end

end

文件属性常用方法

original_filename    获得文件的名字
content_type 得到文件的类型
File.extname(file.original_filename)     扩展名
read 读取文件中的数据(从硬盘上读取到内存中)
write    写文件(把内存中数据写到硬盘中)
size 获取文件大小

这叫土方法

要用 CarrierWave,再结合又拍云carrierwave-upyun,瞬间高大上,但是完成了功能也不知道是怎么办到的,还得去钻研。快速开发得用 Gem,提高能力得自己造轮子。

我一看到标题我就在想楼主应该是纯手写,进来一看,果不其然。。。

并不用什么事情都造轮子,你只需要了解到原理是怎么回事就好了,有的时候我甚至觉得你不需要了解他们的原理(除非特定的需要,如:改进、扩展)

#4 楼 @huacnlee 有时候,懵懵懂懂的对一项功能的好奇,会有特别大是动力去学习和掌握它,谢谢您的指正,这个就是为了让自己更好的理解原理

#3 楼 @cifery 作为一个新手,好些时候不知道怎么走捷径,只好用本方法来做,虽然土了点,重在能用

#1 楼 @huacnlee 大神,你这一针见血的指出,很欢迎,以后会努力提高的代码,向你们看齐

对于新手,愿意去从最土的方法实现功能是很不错的事情。相比那些没有插件不会写代码的强太多。

#8 楼 @hooooopo 谢谢你的肯定~!功能实现了,就是过程有丢丢的折磨人

楼主,我刚开始学 rails,请问关于图片上传,controller 部分该怎么写

#10 楼 @li617111077 这个方法只是一个轮子,你在 Controller 调用这个方法就可以了,如果你是用户上传图片,你可以把这个写在 User 里,然后 在各个 controller 方法里 User.picture_upload(params[:avatar]),就可以了

能不能说一下怎么做的 老大

You need to Sign in before reply, if you don't have an account, please Sign up first.