`

rails文件上传下载和删除 .

阅读更多

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

 

 

 

from:http://blog.csdn.net/xuchao111/article/details/6333605

分享到:
评论
1 楼 112703013 2015-08-13  
你好, 想问个问题 就是我这边上传一个zip文件 大概有100多M,传不上去 请教一下!!

相关推荐

    rails 文件上传

    在Ruby on Rails框架中,...通过理解以上知识点,你将能够构建一个功能完善的Rails文件上传系统,确保用户能安全、便捷地上传和管理他们的文件。在实际项目中,还需要考虑性能优化、错误处理和用户体验等方面的问题。

    升级版本后Rails的文件上传

    6. **测试**:确保为文件上传功能编写测试,覆盖上传、删除、替换和访问已上传文件的各种场景。升级后,这些测试能帮助识别并修复可能出现的问题。 7. **性能优化**:考虑文件上传的性能,如分块上传、预处理(如...

    Rails入门教程一(翻译).pdf

    此外,Rails提供了丰富的插件和gem(Ruby gem),例如Devise用于身份验证,CanCanCan处理授权,Paperclip或Carrierwave用于文件上传等,这些都能极大地增强应用的功能。 在开发过程中,Rails还提供了TDD(测试驱动...

    Agile.Web.Development.with.Rails.4(2013.10).Sam.Ruby.文字版.pdf 一书的配套代码

    8. **Gem生态系统**:Ruby的Gem包管理系统使得开发者可以方便地利用社区开发的库,如Devise(身份验证),CanCanCan(权限控制),Carrierwave(文件上传)等。 9. **Rails发电机**:Rails提供了一系列发电机,如`...

    rails_plugins_presentation.pdf

    - **file_column (文件上传)**:此插件简化了文件上传过程,使得在Rails应用中处理文件上传变得更为直观和高效。它支持多种文件类型,并允许你自定义存储选项,如上传位置、文件名生成策略等。 - **acts_as_state_...

    ruby on rails 2.3.5 api html版

    10. **插件和Gem**:Rails的生态系统中,Gem是第三方库的主要形式,它们提供了额外的功能,如Devise用于身份验证,CanCanCan用于授权,Paperclip或Carrierwave处理文件上传等。 11. **部署**:了解如何将Rails应用...

    ruby on rails最新版

    例如,Devise用于用户认证,CanCanCan用于授权管理,Paperclip或Carrierwave处理文件上传,Stripe或PayPal集成支付功能,以及各种数据分析和报表生成库等。 总的来说,这个压缩包对于Ruby on Rails的初学者或希望...

    应用Rails进行敏捷Web开发中文第三版

    6. **插件和gem**:Rails社区有大量的插件和gem可供扩展功能,如Devise用于用户认证,Cancancan用于授权,或者Paperclip和Carrierwave处理文件上传。 7. **Ajax和JavaScript**:Rails 2.2.2支持集成Prototype ...

    rails-1.0.0

    10. **社区和生态系统**:Rails拥有庞大的开发者社区,产生了许多优秀的第三方Gem库,如Devise(身份验证),Paperclip(文件上传),Pundit(权限控制)等,丰富了Rails的功能。 Rails 1.0.0的发布标志着Web开发...

    Ruby-attache一个文件上传方式

    这个例子展示了如何在Rails控制器中处理文件上传和删除。当然,实际应用中可能需要根据具体需求进行更复杂的定制。 总的来说,Ruby-Attache是一个强大的工具,简化了文件上传的处理,同时提供了丰富的功能和高度的...

    Ruby on Rails 学习案例

    10. **Gem包管理**:Ruby的Gem是类似Python的pip或Node.js的npm的包管理工具,Rails应用广泛依赖于Gems,如Devise用于身份验证,Pundit或CanCanCan用于权限管理,Carrierwave或Paperclip处理文件上传等。 11. **...

    Rails的自动完成分页插件

    这些插件提供了处理文件上传、存储、版本控制和删除的功能。它们可以将文件存储在本地磁盘、云服务如Amazon S3或Google Cloud Storage上,同时提供方便的模型关联和数据库记录。 3. **分页**: 分页是Web应用中...

    Ruby On Rails中文教材(PDF)

    10. **Gem包管理**:Ruby的Gem系统使得安装和管理第三方库变得简单,如Devise用于用户认证,Paperclip或Carrierwave处理文件上传,Bootstrap提供前端UI组件等。 学习Rails的过程中,实践尤为重要。通过完成实际项目...

    征服-Ruby On Rails.rar

    Rails社区活跃,拥有大量的gem(相当于其他语言的库或插件),这些gem扩展了Rails的功能,例如Devise用于身份验证,CanCanCan用于授权管理,Pundit用于细粒度的权限控制,Paperclip或Carrierwave处理文件上传,...

    应用rails进行敏捷web开发

    10. **Rails社区和生态**:Rails有庞大的开发者社区,提供了众多高质量的开源gem,如Devise(用户认证)、Paperclip或Carrierwave(文件上传)、Pundit或CanCanCan(授权)、Resque或Sidekiq(后台任务处理)等。...

    Ruby on Rails 指南 v5.0.1 中文版

    - **上传文件**:介绍如何处理文件上传操作。 - **定制表单生成器**:解释如何创建自定义的表单生成器。 - **理解参数命名约定**:解释表单提交时参数的命名规则。 - **处理外部资源的表单**:指导如何处理来自外部...

    Ruby on Rails入门例子

    在实际开发中,还可以利用各种 Gems(Ruby 社区的库)扩展功能,如 Devise 用于用户认证,Bootstrap 提供响应式布局,以及 Paperclip 或 Carrierwave 处理文件上传等。 通过这个入门例子,你将了解 Rails 的基本...

    Rails 3 in Action

    第九章讨论了 **文件上传** 的实现方式,这是 Web 应用中常见的功能之一。 - **文件上传**: - 实现用户可以上传图片、文档等文件的功能。 - 需要考虑安全性问题,防止恶意文件上传。 - 可以使用第三方服务,如 ...

    Ruby-Administrate一个框架用于在Rails中创建灵活的强大的管理仪表板

    8. **插件系统**:Administrate有一个活跃的社区,提供了许多插件,可以扩展其功能,例如日期范围筛选器、多文件上传等。 9. **版本管理**:“e980d40”这样的版本号可能意味着在项目中锁定特定版本,以确保一致性...

Global site tag (gtag.js) - Google Analytics