hexq 发表于 2006-11-17 14:42

用于点击下载附件的Servlet。

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;
                        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 编辑 ]

powerwind 发表于 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();
            }
       }

powerwind 发表于 2006-11-17 15:27

发觉和楼主的几乎一样。

JSP学习总结

hexq 发表于 2006-11-17 15:56

寒,。。太类似了吧~~~~

hexq 发表于 2006-11-17 16:01

还有一种处于安全,在给用户显示图片之类文件的时候,并不是直接给出相对图片路径来显示,也是通过一个Servlet来显示,正在研究。。。

powerwind 发表于 2006-11-17 16:08

按验证码的原理,图片通过Servlet来显示,算不算?
没试过,师兄研究出来后分享一下吧

hexq 发表于 2006-11-17 16:14

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

powerwind 发表于 2006-11-17 16:46

我说的是这样:

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

image.jsp

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

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

showImage.jsp
<img src="image.jsp" />
页: [1]
查看完整版本: 用于点击下载附件的Servlet。