文件下载

      做项目过程中,不可避免的会使用到下载功能,本文实现了从ftp文件服务器下载文件指定文件。具体操作如下:

前提是需要下载的文件已经放在了指定的ftp文件服务器上面。

     view层:页面上提供下载按钮,供用户对指定文档进行下载。

代码如下:

  <td><a class="btn btn-primary btn-small-height " href="/documents/download?type=document&file_name=<%= URI::escape(document[:file])%>">下载</a></td>

注释:

1、这里指定了下载的文件名称file_name,同时对文件名进行了转义编码,避免url中出现特殊字符,

2、因为这里提供文档下载和工具包下载,所以我这里多传了一个参数type,如果用不到则不必要传。

 

controller层代码:

 1 def download
 2     type = params[:type]
 3     file = params[:file_name]
 4     is_dir_exist = File.directory?'public/download_documents'
 5     if !is_dir_exist
 6       Dir::mkdir 'public/download_documents'
 7     end
 8     path = File.join("public/download_documents", file)
 9     begin
10       upload_cmd(SysUtils::FILE_SERVER[:host], SysUtils::FILE_SERVER[:user], SysUtils::FILE_SERVER[:passwd]) do |conn| #连接ftp文件服务器
11           conn.chdir("/platform_tools/document")  #切换到存放文件的目录
12         conn.getbinaryfile(file, "public/download_documents/#{file}")
13         send_file(path,filename: CGI::escape(CGI::unescape("#{file}")))
14       end
15     rescue Exception=> e
16       flash[:error] = "下载失败,请稍后重试!"
17       redirect_to document_download_documents_path
18       SysUtils.send_mail((SysUtils::MAIL_TO+[current_user.email]).uniq, "资料下载失败!",  "#{$!}, #{e}")
19     end
20     Thread.new do   #这里另起一个线程删除下载到本地的文件
21       sleep 100
22       File.delete(path)
23     end
24   end

主要实现思路是:从ftp文件服务器下载指定文件到当前项目根目录的public文件夹下面,这里在public文件夹下面新建了一个文件夹download_documents文件夹,作为临时中转文件夹,然后使用send_file方法输出该文件。这样用户就可以得到目的文件了。

最后,因为从ftp文件服务器上面读取文件到本地指定目录,这样本地项目就会增大,所以需要将下载的文件进行删除。这里当该文件输出之后,就另起了一个线程将项目目录上面的这个文件删除。

 

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