工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 1859|回复: 7

用于点击下载附件的Servlet。

[复制链接]
发表于 2006-11-17 14:42 | 显示全部楼层 |阅读模式
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DownLoadServlet extends HttpServlet {
        private static final long serialVersionUID = -9121322693805808904L;
        private static final String CONTENT_TYPE = "text/html; charset=GBK";
        // Initialize global variables
        public void init() throws ServletException {
        }

        // Process the HTTP Post request
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                        throws ServletException, IOException {
                response.setContentType(CONTENT_TYPE);
                String filePath = (String)request.getParameter("filePath");// 要下载的文件
                String fileName = (String)request.getParameter("fileName");// 保存窗口中显示的文件名
                fileName = response.encodeURL(new String(fileName.getBytes(),
                                "ISO8859_1"));
                try {
                        response.reset();
                        response.setContentType("APPLICATION/OCTET-STREAM");
                        response.setHeader("Content-Disposition", "attachment; filename=\""
                                        + fileName + "\"");
                        ServletOutputStream out = response.getOutputStream();
                        InputStream inStream = new FileInputStream(filePath);
                        // 循环取出流中的数据
                        byte[] b = new byte[1024];
                        int len;
                        while ((len = inStream.read(b)) > 0) {
                                out.write(b, 0, len);
                        }
                        out.close();
                        inStream.close();
                } catch (Exception e) {
                        System.out.println(e);
                }
        }
        // Clean up resources
        public void destroy() {
        }
}
在上下文中配置好该Servlet,具体使用的时候带filePath和 fileName这两个参数进入就可以了。。

[ 本帖最后由 hexq 于 2006-11-17 14:45 编辑 ]
发表于 2006-11-17 15:23 | 显示全部楼层
支持楼主。

我也写过一个,还做成标签,后来发现做成标签没多大意义。

public void handleRequest(HttpServletRequest request,
              HttpServletResponse response) throws IOException, ServletException {
              String name = request.getParameter("name");
              String type = request.getParameter("type");
              String dir = request.getParameter("dir");
              if (name == null || name.length() < 2 || dir == null || dir.length() < 1 || type == null || type.length() < 1) {
                     throw new ServletException("Sorry,error occured");
              }
              char ch = dir.charAt(dir.length() - 1);
              if (ch != '/' || ch != '\')
                     dir = dir + "/";
              ServletOutputStream os = null;
              BufferedInputStream bis = null;
              try {
                     File file = new File(dir + name);
                     if (!file.exists() || file.length() >= Integer.MAX_VALUE) {
                            logger.error("Invalid file or file to large,file: " + name);
                            throw new ServletException(
                                          "Invalid file or file to large,file: " + name);
                     }
                     response.setContentType("application/" + type);
                     response.addHeader("Content-Disposition", "attachment; filename="+ name);
                     response.setContentLength((int) file.length());
                     os = response.getOutputStream();
                     bis = new BufferedInputStream(new FileInputStream(file));
                     int size = -1;
                     while ((size = bis.read()) != -1)
                            os.write(size);
              } catch (IOException ioe) {
                     throw new ServletException(ioe.getMessage());
              } finally {
                     if (os != null)
                            os.close();
                     if (bis != null)
                            bis.close();
              }
       }
回复

使用道具 举报

发表于 2006-11-17 15:27 | 显示全部楼层
发觉和楼主的几乎一样。

JSP学习总结
回复

使用道具 举报

 楼主| 发表于 2006-11-17 15:56 | 显示全部楼层
寒,。。太类似了吧~~~~
回复

使用道具 举报

 楼主| 发表于 2006-11-17 16:01 | 显示全部楼层
还有一种处于安全,在给用户显示图片之类文件的时候,并不是直接给出相对图片路径来显示,也是通过一个Servlet来显示,正在研究。。。
回复

使用道具 举报

发表于 2006-11-17 16:08 | 显示全部楼层
按验证码的原理,图片通过Servlet来显示,算不算?
没试过,师兄研究出来后分享一下吧
回复

使用道具 举报

 楼主| 发表于 2006-11-17 16:14 | 显示全部楼层
我说的出于安全指得是,在显示图片的时候,如果给出文件路径的话,用户在查看包含该图片的页面的时候,可以通过查看源文件知道文件名,而且也可以估计到这个文件可能保存在应用下的某个目录,这样就很不安全了。。
回复

使用道具 举报

发表于 2006-11-17 16:46 | 显示全部楼层
我说的是这样:

由于JSP文件比Servlet简单,我用JSP文件来写了个例子。

image.jsp

  1. <%@ page contentType="image/jpeg" import="java.awt.image.*,java.util.*,javax.imageio.*" %>
  2. <%
  3. BufferedImage image =ImageIO.read(new java.io.FileInputStream("e:/cpp/1.jpg"));
  4. // 输出图象到页面
  5. ImageIO.write(image, "JPEG", response.getOutputStream());
  6. %>
复制代码


在需要图片的JSP文件中,这样调用。

showImage.jsp
  1. <img src="image.jsp" />
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2025-5-16 03:54

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表