使用servlet从URL下载文件或文件夹

时间:2017-05-26 20:22:04

标签: java jsp servlets download directory

我对JSP / Servlets很新,并尝试通过使用JSP文件中的以下代码将文件/文件夹路径和文件/文件夹名称传递给servlet来从我的本地目录下载文件/文件夹

<a href="<%=request.getContextPath()%>\download?filename=<filename>&filepath=http://192.168.0.101:8080<%=request.getContextPath()%>/<foldername>">Download Here</a>

我想增强我的servlet以下载在网址中传递的任何类型的文件或文件夹

e.g. 
If the Folder/File URL is passed to the servlet

http://192.168.0.101:8080/folder
http://192.168.0.101:8080/file.pdf

以下是我的Servlet代码:

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DownloadServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String filename = request.getParameter("filename");
        String filepath = request.getParameter("filepath");
        BufferedInputStream buf=null;
           ServletOutputStream myOut=null;

        try{

        myOut = response.getOutputStream( );
             File myfile = new File(filepath+filename);
             response.setContentType("application/x-download"); 
             response.addHeader(
                "Content-Disposition","attachment; filename="+filename );
             response.setContentLength( (int) myfile.length( ) );
             FileInputStream input = new FileInputStream(myfile);
             buf = new BufferedInputStream(input);
             int readBytes = 0;
             while((readBytes = buf.read( )) != -1)
               myOut.write(readBytes);
        } catch (IOException ioe){
                throw new ServletException(ioe.getMessage( ));
             } finally {
                 if (myOut != null)
                     myOut.close( );
                  if (buf != null)
                  buf.close( ); 
             }
    }
}

如果有人能通过上述问题指出我正确的方向,那对我来说真的很有帮助。

1 个答案:

答案 0 :(得分:0)

您无法从HTTP URL下载文件夹。你总是下载文件。

如果你想下载一个完整的目录,你基本上必须以递归方式下载其中的所有文件和其子目录中的文件。或者,您可以创建该文件夹的存档,并将其作为下载提供。

您应该为以下代码部分使用缓冲区,而不是在每次迭代中读取一个字节。

int readBytes = 0;
while((readBytes = buf.read( )) != -1)
    myOut.write(readBytes);

使用缓冲区

byte[] buffer = new byte[4096];//4K buffer
int readLen = 0; //Number of bytes read in last call to read, max is the buffer length
while((readLen = buf.read(buffer)) != -1) {
    myOut.write(buffer, 0, readLen);
}
  • 不要关闭myOut OutputStream,它由Servlet处理 容器。经验法则是如果你没有打开它就不要关闭它。

  • filePath传递给Servlet可能会带来安全风险,您不知道用户会尝试下载哪些文件,他可能会尝试下载密码哈希。您应该创建相对于要提供下载的文件夹的文件路径。然后,您将始终必须将该文件夹路径添加到相对路径,以便用户只能从该文件夹下载文件。

  • 在下载页面上,您可以列出(File.list())下载文件夹中的文件和文件夹,作为文件夹的超链接,这样用户就不必输入文件名或路径。