ROR中文件的上传与下载

 
创建一个数据库(mysql):
use 库名 ;
drop table if exists records;
create table records
(
 id int NOT NULL AUTO_INCREMENT,
 name varchar(50) not null,
 person MEDIUMBLOB not null,
 PRIMARY KEY (id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8
 
name 用来存放上传文件的文件名。
person 用来保存上传文件的二进制流。
MySQL 数据库为 BLOB 做出的定义如下: BLOB 数据类型是一种大型的二进制对象,可以保存可变数量的数据。 BLOB 具有四种类型,分别是 TINYBLOB,BLOB, MEDIUMBLOB LONGBLOB ,区别在于各自所能够保存的最大数据长度不同。
·tinyblob: 255 个字符
·blob:
最大限制到 65K 字节
·mediumblob:
限制到 16M 字节
·longblob:
可达 4GB
 
创建一个视图:
<%= start_form_tag ({ :action => 'create' }, { "name" => "form1" , :multipart => true }) %>
<input type = 'file' name = 'file' id = 'file' /><br>
<%= submit_tag ' 上传 ' %>
<%= end_form_tag %>
start_form_tag 标签中 :multipart => true 会产生在 HTML 的表单中加入 enctype="multipart/form-data" multipart/form-data 能提高二进制文件的传输效率。表单标签中设置 enctype="multipart/form-data" 来确保匿名上载文件的正确编码
 
 
创建一个控制器:
class UploadController < ApplicationController
  def create
       sf = SaveFile.save( @params [ "file" ]) if @params [ "file"
end
  def get_file
     num = Record.find( :all , :order => "id DESC" )
send_data(num[ 0 ].person, :type => "image/jpeg" , :disposition => "inline" )
     #send_data(num[0].person,:filename=>num[0].name)
  end
end
create 方法会调用 SaveFile 模型的 save 方法将文件的二进制流保存到数据库中。
get_file 方法用于提供用户下载(如 rar )或直接显示给拥护(如图象),其中 :type 的值需要按文件的类型而定,如 jpg 格式的图象是“ image/jpeg ”, rar 则是使用默认的类型“ application/object-stream ”。
:disposition 设置为 inline 表示直接显示数据,设置为 attachment 表示下载,默认为下载。
get_file 的过程为从数据库中取得全部数据并按 id 号倒序排列并返回一个二维数组,数组 [0] 也就相当于最新插入的文件了。 Person 列存储的是该文件的二进制流。
 
创建一个模型:
class SaveFile < ActiveRecord::Base
  def self.save(person)
      file = person.read
      name = person.original_filename
      if file && name
        Record.create( :name =>name, :person =>file)
      end
  end
end
save 方法的 person 参数接受一个 file 对象, read 方法取得该文件的二进制流, length 得到上传文件的大小 ( 单位 b) 用该方法可实现对上传文件大小的限制 , original_filename 获得文件名, content_type 得到文件类型, local_path 获得服务器上传文件存放的位置(在客户端文件上传时会将文件存放到服务器 C 盘下当前用户的 Temp 目录下如: C:/Documents and Settings/xuxiaolai/Local Settings/Temp )在该目录下文件名为 CGI 开头的就为上传的临时文件,所以用该方法取得的也是临时文件存放的目录 ,这些临时文件在随后的上传过程中会被自动清除。该模型用于存放文件到数据库。如需存放到服务器的磁盘中需更改至如下样式:
class SaveFile < ActiveRecord::Base
  def self.save(person)
       if person
File.open("pictures/#{person. original_filename ]}", "wb") { |f| f.write(person.read) }
end
  end
end
为了避免破坏二进制文件,必须调用 File.open 的二进制模式 ’wb’
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值