我对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( );
}
}
}
如果有人能通过上述问题指出我正确的方向,那对我来说真的很有帮助。
答案 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
可能会带来安全风险,您不知道用户会尝试下载哪些文件,他可能会尝试下载密码哈希。您应该创建相对于要提供下载的文件夹的文件路径。然后,您将始终必须将该文件夹路径添加到相对路径,以便用户只能从该文件夹下载文件。