rails文件上传下载和删除

    技术2022-05-19  20

    Model中的部分:

    class SystemUploadfile < ActiveRecord::Base   Region = ["北京","西安"]   File_extname = [".rar",".7z",".zip"]   File_target = "public/files"   cattr_accessor :per_page   @@per_page = 10   validates :title,:presence=>true   validates :area,:presence=>true   validates :file_name,:presence=>true   validates :file_url,:presence => true   validates_format_of :file_url,     :with => %r{/.(rar|zip|7z)}i   def set_file_values(file_url,file_name)     self.file_url = file_url     self.file_name = file_name   end   def add_download_count     self.counts += 1     self.save   end   def get_file_path     return SystemUploadfile::File_target+"/"+ self.file_url   end   #删除文件   def delete_file     file_path = File.join(Rails.root,SystemUploadfile::File_target,self.file_url)     if File.exist?(file_path)       File.delete(file_path)     end   end end

    Action中的部分如下:

    class SystemUploadfilesController < ApplicationController     def index     @search = SystemUploadfile.search(params[:search]).order('id')     @system_uploadfiles = @search.paginate(:page => params[:page],:per_page => SystemUploadfile.per_page)   end     def new     @system_uploadfile = SystemUploadfile.new     respond_to do |format|       format.html # new.html.erb       format.xml  { render :xml => @system_uploadfile }     end   end   def create     #如果说什么也没有接收到     if request.get?       @system_uploadfile = SystemUploadfile.new       flash.now[:notice] = "文件上传失败"       render :action => "new"     else       @system_uploadfile = SystemUploadfile.new(params[:system_uploadfile])       #获取上传的文件       uploaded_file = params[:system_uploadfile][:file_url]       if_succ,filepath = upload_file(uploaded_file,SystemUploadfile::File_extname,SystemUploadfile::File_target)       if if_succ         @system_uploadfile.set_file_values(filepath, uploaded_file.original_filename)         if @system_uploadfile.save           redirect_to system_uploadfiles_path,:notice => "文件上传成功"         else           render :action => "new"         end       else         flash.now[:notice] = filepath         render :action => "new"       end     end   end   def download     @system_uploadfile = SystemUploadfile.find_by_id(params[:id])     if @system_uploadfile == nil       redirect_to system_uploadfiles_path, :notice => '没有记录,下载失败!'     else       file_path = @system_uploadfile.get_file_path       if File.exist?(file_path)         #@system_uploadfile.add_download_count         #send_file file_path,:disposition => 'inline'         io = File.open(file_path)         io.binmode         send_data(io.read,:filename => @system_uploadfile.file_name,:disposition => 'attachment')         io.close       else         redirect_to system_uploadfiles_path, :notice => '文件不存在,下载失败!'       end     end   end     def destroy     @system_uploadfile =  SystemUploadfile.find_by_id(params[:id])     if @system_uploadfile == nil       flash.now[:notice] = '该记录已被删除'       redirect_to system_uploadfiles_path     else       @system_uploadfile.delete_file         @system_uploadfile.destroy         respond_to do |format|           format.html { redirect_to(system_uploadfiles_path) }           format.xml  { head :ok }         end     end   end end Form:html部分

    <% form_for( @system_uploadfile,:html=>{:multipart => true}) do |f| -%>   <%= f.label :title, "标题:" %>   <br />   <%= f.text_field :title%>   <em style="color:red;"><%= f.error_message_on :title %></em>   <br />   <%= f.label "区域" %>   <%= f.select :area,options_for_select(SystemUploadfile::Region) %>   <br></br>   选择上传文件:<br/>   <%= file_field(:system_uploadfile, :file_url)%>   <em style="color:red;"><%= f.error_message_on :file_url %></em>   <br/>   <%= f.submit "提交", :disable_with => '提交中...'%> <% end -%>

    程序中用到的一个方法:

     def upload_file(file,extname,target_dir)     if file.nil? || file.original_filename.empty?       return false,"空文件或者文件名错误"     else       timenow = Time.now       filename = file.original_filename  #file的名字       fileloadname = timenow.strftime("%d%H%M%S")+filename #保存在文件夹下面的上传文件的名称       if extname.include?(File.extname(filename).downcase)         #创建目录         #首先获得当前项目所在的目录+文件夹所在的目录         path = Rails.root.join(target_dir,timenow.year.to_s,timenow.month.to_s)         #生成目录         FileUtils.makedirs(path)         File.open(File.join(path,fileloadname),"wb") do |f|           f.write(file.read)           return true,File.join(timenow.year.to_s,timenow.month.to_s,fileloadname)         end       else         return false,"必须是#{extname}类型的文件"       end     end   end


    最新回复(0)