本文实例为大家分享了servlet实现文件上传与下载的具体代码,供大家参考,具体内容如下
内容
我们分两大模块来进行讲解,即上传的实现,与下载的实现
上传的实现
注意了我们在写上传表单的时候必须声明提交方式为post类型,enctype="multipart/form-data",这样的话才能实现上传。
当我们提交表单的时候看看响应体中都有什么内容:
好了,我们有了数据了,接下来我们怎么提取数据呢,注意我们已经不能使用requeest.getParamter()方法来进行参数的提取了,那怎么办呢,我们总不能自己写实现类来进行分割吧!我们可以使用Commons提供的小工具。
好了,让我们来看看具体的操作步骤吧!这里我就不详细说了,一文代码流过:
public class FileUploadServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String path = request.getSession().getServletContext().getRealPath("/WEB-INF");
//解决缓存大小,要不然你的内存会爆的。
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory(1024 * 10,new File(path + "/" + "tmp2") );
ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);
List<FileItem> l = null;
try {
l = fileUpload.parseRequest(request);
FileItem f2 = l.get(0);
//解决文件存放在WEN_INF目录下问题
path = path + "/tmp";
//解决浏览器传递绝对路径问题
String name = f2.getName();
int i = name.lastIndexOf("/");
if(i != -1) {
name = name.substring(i);
}
//解决文件重名问题
name = (UUID.randomUUID().toString().replace("-","").trim()) + name;
//文件打散问题解决方法演示之hash打散
int has = name.hashCode();
//转换位16进制位,我们使用前两个值来判断
String hex = Integer.toHexString(has);
path = path + "/" + hex.charAt(0) + "/" + hex.charAt(2) ;
File file = new File(path);
if(! file.exists()) {
file.mkdirs();
}
f2.write(new File(path + "/" + name));
request.setAttribute("msg","恭喜你,上传成功了!");
request.getRequestDispatcher("/index.jsp").forward(request, response);
} catch (Exception e) {
request.setAttribute("msg",e.getMessage());
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
}
}
好了,上传的问题基本就解决了。
下载的实现
下面我们来看一下下载问题的解决方案
下载文件是我们必须来设置两个响应头,设置Content-Disposition:它的默认值为inline,表示在浏览器窗口中打开!attachment;filename=xxx要不然我们输出的内容不会弹出保存框,只会显示在浏览器中。
设置Content-Type:你传递给客户端的文件是什么MIME类型
然后我们就可以new一个输入流来读取本地硬盘中的文件,在输出到ServleoutputStream中
在来一行代码流过:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String mimeType = request.getSession().getServletContext().getMimeType("\\WEB-INF\\tmp\\2\\5\\"
+ "87bd61a4b7c346a5a2e6c072de84acda5.JdbcUtils处理多线程并发访问问题.avi");
//解决文件名乱码问题
String filename = "87bd61a4b7c346a5a2e6c072de84acda5.JdbcUtils处理多线程并发访问问题.avi";
filename = encoding(filename, request);
//两个请求头
response.setHeader("Content-Type",mimeType);
response.setHeader("Content-Disposition","attachment;filename=" + filename);
ServletOutputStream out = response.getOutputStream();
String path = request.getSession().getServletContext().getRealPath("\\WEB-INF\\tmp\\2\\5\\"
+ "87bd61a4b7c346a5a2e6c072de84acda5.JdbcUtils处理多线程并发访问问题.avi");
File file = new File(path);
FileInputStream inputStream = new FileInputStream(file);
IOUtils.copy(inputStream, out, 1024*1024);
}
private String encoding(String filename,HttpServletRequest req) throws UnsupportedEncodingException {
String user_agent = req.getHeader("User-Agent");
String encodingFileName = null;
if(user_agent.contains("Firefox")) {
//按道理来说应该使用 BASE64Encoder进行编码,但是不知道为什么不能成功
//那我们只能使用这种方式了
encodingFileName = new String(filename.getBytes("UTF-8"), "ISO-8859-1");
}
else {
encodingFileName = URLEncoder.encode(filename,"utf-8");
}
return encodingFileName;
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。