标签:send 特殊字符 download 就会 new ref 重试 div mkdir
做项目过程中,不可避免的会使用到下载功能,本文实现了从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文件服务器上面读取文件到本地指定目录,这样本地项目就会增大,所以需要将下载的文件进行删除。这里当该文件输出之后,就另起了一个线程将项目目录上面的这个文件删除。
标签:send 特殊字符 download 就会 new ref 重试 div mkdir
原文地址:http://www.cnblogs.com/x123811/p/7094266.html