最近在做一个自己的项目,在图片上传的时候,如果用系统的如
<%= 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 获取文件大小