ruby项目文件上传功能实现

这里我将从视图、控制器各个层面进行讲解。

 rails 提供了文件上传功能,可以直接进行下面的编码

<%= form_for :document, :html =>{:multipart => true} do |f| %>
  <%= f.file_field :file %>
  <%= f.submit "Upload" %>
<% end %>

控制器层面:

document_controller.rb中

 
#创建一个新文档
def create  
    @document = Document.new(document_params)
    unless request.get?
      filename = uploadfile(@document.file)
      @document.file = filename
     if  @document.save
       redirect_to list_documents_path
     else
       @document.file = nil
       render "new"
     end
    end
  end


def uploadfile(file)
    require 'net/ftp'
    if !file.original_filename.empty?  #file.original_filename 获取文件名字
      filename = CGI::escape(file.original_filename)
      FileUtils.mkdir("#{Rails.root}/public/upload") unless File.exist?("#{Rails.root}/public/upload")
      #wb 表示通过二进制方式写,可以保证文件不损坏
      File.open("#{Rails.root}/public/upload/#{filename}", "wb") do |f|
        f.write(file.read)
      end
      path = "#{Rails.root}/public/upload/#{filename}"
      local_file = path
      upload_cmd(SysUtils::FILE_SERVER[:host], SysUtils::FILE_SERVER[:user], SysUtils::FILE_SERVER[:passwd]) do |conn|  #打开文件服务器
        conn.chdir("/platform_tools/document")  #切换到保存文档的目录
        cur_files = conn.nlst
        cur_file_flag = true
        cur_files.each do |month_file|
          if month_file.include?("#{filename}")
            cur_file_flag =false
          end
        end
        if cur_file_flag
          conn.putbinaryfile(local_file,"/platform_tools/document/"+CGI::unescape(filename))
        end
      end if File.exists?(local_file)
      File.delete(path)
      return CGI::unescape(filename)
    end
  end

 

private
Directory = "/public/upload/"
def document_params
params.require(:document).permit(:title,:brief_introduction,:detail_introduction,:status,:file)
end

这样就可以简单实现文档的上传操作了。

我这里数据库中保存的是上传文件的文件名,同样你也可以保存文件路径、文档类型之类的,不过我这里不需要,所以没有实现。

 

posted @ 2017-06-29 11:03  开尔  阅读(2076)  评论(0编辑  收藏  举报