在下载图片这个案例中需要将响应体的mime类型设置为image/png或者image/jpg等,它是通过content-type指定的。什么是mime类型呢?HTTP是媒体独立的,这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送,客户端以及服务器指定使用适合的MIME-type内容类型。还需要用到Content-Disposition这个头信息,这个头信息可以请求浏览器要求用户以给定名称的文件把响应保存到磁盘。
如果文件名是中文的话,可能会出现乱码问题,一般将字符串转成utf-8的编码方式就行了
在这个案例中还需要用到ServletContext获取某个资源的绝对路径,才能将它转换为FileInputStream,当然你自己指定某个资源的绝对路径,但这种方式就不是很灵活,因为服务器上的资源都是相对的。由于ServletContext是全局的,所以它可以做一些全局的事,由于它的方法很多,需要的时候查文档或者看源码就行了。
还需注意一个问题,由于编写的Servlet程序最终是需要编译、打包、部署到服务器上的,所以资源的获取就要根据打包后的相对位置来获取。不过本地服务器上也可以通过制定绝对路径,不过这样就不灵活。
Servlet代码public class ServletDemo10 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String path = this.getServletContext().getRealPath("/WEB-INF/classes/小汤圆.png"); System.out.println(path); this.getServletContext(). String name = path.substring(path.lastIndexOf('\')); FileInputStream in = new FileInputStream(path); ServletOutputStream out = resp.getOutputStream(); resp.setHeader("content-type","image/png"); resp.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(name,"utf-8")); try{ byte[] buffer = new byte[1024]; int len; while ((len = in.read(buffer)) != -1){ out.write(buffer,0,len); } out.flush(); } catch (Exception e){ e.printStackTrace(); }finally { if(in != null){ in.close(); } if(out != null){ out.close(); } } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }web.xml注册Servlet,设置它的对外虚拟访问路径
效果图demo10 com.ace.demo.ServletDemo10 demo10 /demo10
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)