文件下载

Posted 开尔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件下载相关的知识,希望对你有一定的参考价值。

      做项目过程中,不可避免的会使用到下载功能,本文实现了从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文件服务器上面读取文件到本地指定目录,这样本地项目就会增大,所以需要将下载的文件进行删除。这里当该文件输出之后,就另起了一个线程将项目目录上面的这个文件删除。

 

以上是关于文件下载的主要内容,如果未能解决你的问题,请参考以下文章

在Tomcat的安装目录下conf目录下的server.xml文件中增加一个xml代码片段,该代码片段中每个属性的含义与用途

代码片段 PHP,预期文件结尾,我错在哪里?

代码适用于与单个 html 文件不同的堆栈片段

VS code自定义用户代码片段snippet

Java itext为pdf 文件添加水印核心功能代码片段

VSCode自定义代码片段——声明函数