用于点击下载附件的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 编辑 ] 支持楼主。
我也写过一个,还做成标签,后来发现做成标签没多大意义。
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();
}
}
发觉和楼主的几乎一样。
JSP学习总结 寒,。。太类似了吧~~~~ 还有一种处于安全,在给用户显示图片之类文件的时候,并不是直接给出相对图片路径来显示,也是通过一个Servlet来显示,正在研究。。。 按验证码的原理,图片通过Servlet来显示,算不算?
没试过,师兄研究出来后分享一下吧 我说的出于安全指得是,在显示图片的时候,如果给出文件路径的话,用户在查看包含该图片的页面的时候,可以通过查看源文件知道文件名,而且也可以估计到这个文件可能保存在应用下的某个目录,这样就很不安全了。。 我说的是这样:
由于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]