上传附件或者图片,通过自己掌握的知识,独立实现了文件的上传和下载,其实并不复杂,只要理解File类的读写操作即可,同时为了让文件保存具有无限增长性(也就是上传文件不重名),使用了随机生成文件名的方法。同时在数据库中采用一个字段,保存文件信息。
通过自己的琢磨,对文件的上传下载有了切身的体会。然后反过来,使用attachment_fu插件。
安装不必说了,google一把就有一大堆。下面按照应用的顺序展开说:
1.创建model,比如attachments.rb
id | int(11)
filename | varchar(255)
content_type | varchar(255)
size | int(11)
width | int(11)
height | int(11)
parent_id | int(11)
thumbnail | varchar(255)
created_at | datetime
updated_at | datetime
具体做法:
script/generate model Attachment
然后在db目录下修改***create_attachments.rb,最终为:
end
class CreateAttachments < ActiveRecord::Migration
def self.up
create_table :attachments do |t|
t.column :filename, :string
t.column :content_type, :string
t.column :size, :integer
t.column :width, :integer
t.column :height, :integer
t.column :parent_id, :integer
t.column :thumbnail, :string
t.timestamps
end
end
def self.down
drop_table :attachments
end
end
然后rake db:migrate
在attachments.rb中写入如下代码:
class Attachment < ActiveRecord::Base
has_attachment :storage => :file_system,
:thumbnails => {:thumb => [20,20], :tiny =>[10,10] }
validates_as_attachment
end
知识点:
a.需要说明的是has_attachment后面的参数比较多。常用的,如果与图片相关,可以讲size之类的参数加入。我的这个案例是任何文件,同时兼顾实用图片的缩略图。缩略图使用两种:thumb和tiny,这两种可以按照你的想象力任意命名。如thumb1和tiny1.都会填写到模型的thumbtail属性值中。
b.validates_as_attachment使用之后的后果。
经常性的不能将附件上传成功。查看原因的时候,development.log,会看到如下错误:
DEPRECATION WARNING: ActiveRecord::Errors.default_error_messages has been deprecated. Please use I18n.translate('activerecord.errors.messages').. (called from default_error_messages at D:/IR2/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/validations.rb:24)
在网上查询之后,参照javaeye中的http://lectery.iteye.com/blog/337435 对attachment的源代码修改之后,恢复正常。不过记得需要重启mongrel服务。
c.使用attachment_fu插件之后,具备一个重要的方法,public_filename。他是模型中定义的方法,可以让controller来使用返回文件的原始位置。这个方法作用大大的,可让view中正确的处理附件。同时可以调用缩略图等。
呵呵,还可以使用console进行调测,这是很爽的一件事情。
>> Attachment.find(47).public_filename
=> "/attachments/0000/0047/Water_lilies.jpg"
>> Attachment.find(47).public_filename :thumb
=> "/attachments/0000/0047/Water_lilies_thumb.jpg"
(这里有一个小bug,在public_filename的后面可以跟任意symbol,都可以返回值,而这些返回值对应的文件压根就不存在)
2.编写控制器中action代码,view中的视图代码
action代码中的new:
def new
@attachment = Attachment.new
end
对应new.html.erb
<% form_for(:attachment, :url => { :action => "create" }, :html => { :multipart => true }) do |form| %>
<%= form.file_field :uploaded_data %>
<%= submit_tag "Create" %>
<%end%>
create代码:
def create
@attachable_file = Attachment.new(params[:attachment])
if @attachable_file.save
flash[:notice] = 'Attachment was successfully created.'
else
flash[:notice] = 'Attachment is failure.'
end
end
呵呵,上传附件从此简单
2.使用send_file打开附件
view代码
<%=button_to '下载',:action => "send_file_to_user" %>
点击‘下载’按钮,下载文件,调用send_file_to_user
位于控制器中的send_file_to_user代码
def send_file_to_user
send_file "#{RAILS_ROOT}/public/files/"+'Winter.jpg',
:disposition => "inline",
:filename => "Winter1.jpg"
end
这里需要说明:
inline,表明直接显示出来。如果是图片可以直接显示;如果希望用户下载,改为‘attachment’即可。
filename是用户可以看到的下载文件名,无关紧要。
第一个参数最重要,这里仅仅是一个具体的文件显示案例,可以结合attachment_fu提供的public_filename获取文件名,动态的根据用户需求完成文件的显示或下载。
分享到:
相关推荐
AT_Attachment_with_Packet_Interface_-_7_Volume_3
_storage_emulated_0_android_data_com.tencent.mm_MicroMsg_517174082dbc007f25c5bd836bdd4446_attachment_段润昌_648.wps
在MATLAB编程环境中,"H_attachment_comprose_matlab_"这个标题暗示了我们正在处理一个与图像处理或图形绘制相关的任务,特别是与生成特定形状的方位标志有关。方位标志通常用于图表中,以便清晰地指示出方向或者...
ATA接口的详细解读,working draft proposed American National Standard for Information Systems - ATA (ATAttachment) 78页
标题中的"attachment_1487958_16b_win64_2017-05-10"很可能是一个软件安装包或更新文件,尤其考虑到它与MATLAB 2016相关。这个文件名包含了几个关键信息:首先,“16b”可能表示这是MATLAB的一个版本号,可能是R2016...
1. **信道编码**:在物理层,LTE采用Turbo编码或LDPC编码来提高数据的抗干扰能力。这些编码技术在编码后会附加CRC,以检测编码后的数据块是否在传输过程中被破坏。 2. **PDCCH(Physical Downlink Control Channel...
Information Technology - AT Attachment with Packet Interface - 6 (ATA/ATAPI-6)ATA_ATAPI-6标准规范,驱动开发参考文档
attachment_1 = pd.read_excel(r"C:\Users\86136\Desktop\C题(1)\附件1.xlsx") attachment_2 = pd.read_excel(r"C:\Users\86136\Desktop\C题(1)\附件2.xlsx") # Display the first few rows of each dataset for a ...
通过编写 Rectangle 类,可以了解如何定义类、如何使用成员变量和成员方法,以及如何实践面向对象编程的基本原则。 圆类 Circle 圆类 Circle 是一个基本的几何图形类,拥有一个成员变量 radius,表示圆的半径。该...
西门子840d数控系统说明。对方的更多更好
Attachment 1_chazhi.xlsx
very interesting matlab hev model
"attachment_finder_app" 是一个基于JavaScript开发的简单应用,主要用于帮助用户管理和标记带有附件的票证。这个应用程序的独特之处在于它允许用户自定义标签,这些标签可以方便地应用于各种票证,进而使得在报告、...
在IT行业中,"Attachment_Project:附件项目"是一个可能与文件管理和Web应用相关的项目。这个项目的描述非常简洁,只提到了“附件项目”这个名字,没有提供具体的功能或目标。不过,结合给出的标签“HTML”,我们可以...
attachment_doc是一个SquirrelMail插件,允许用户使用其浏览器查看电子邮件中的文档附件。 该插件将文档转换为html格式。 目前支持MSWord(DOC)和可移植文档格式(PDF)!
总的来说,"bugzilla_attachment_viewer" 是一个利用 JavaScript 实现的高效工具,它提升了用户在使用 Bugzilla 追踪和解决软件问题时的体验,体现了 JavaScript 在浏览器扩展开发中的强大能力。
标题中的"566223_ATTACHMENT01_filamentwinding_filament_zip_"似乎是一个文件名,其中包含了关键词"filament winding",这通常是指一种制造复合材料管状或圆柱形结构的技术。该技术涉及将连续纤维(如碳纤维或玻璃...
1. `manifest.json`:这是Chrome扩展的核心配置文件,包含了扩展的基本信息,如扩展名、版本号、权限要求、图标、背景脚本等。 2. `background.js`:背景脚本,持续运行并监听用户在Backlog页面上的活动。 3. `...
标题中的“347977_ATTACHMENT01_Drillstringmodel_stick-slip_stickslip_zip_”似乎是一个特定的文档标识符,它可能指的是一个关于钻柱模型(Drillstring model)中粘滑(Stick-slip)现象的研究或技术资料的压缩包...
1649480820617212_attachment.cgi