SmartUpload上传下载使用

来源:互联网 发布:sql语句insert 编辑:程序博客网 时间:2024/04/30 02:34

由于工作需要,用到了SmartUpload来实现文件的上传下载功能,写了小demo记录下,方便以后使用。



上传部分:

表单上传页面 upload.jsp:

此处需要注意的有三点:

1.提交方式为“post”

2.由于是文件上传,不是普通的提交请求参数,所以要将表单封装,需要添加enctype="mutipart/form-data"属性

3.保证在应用根目录下有存放上传文件的"upload"文件夹

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>文件上传表单页</title></head><body><form action="uploadProc.jsp" method="post" enctype="multipart/form-data">选择上传的文件:<input type="file" name="file"><input type="submit" value="提交"></form></body></html>

处理文件上传的jsp uploadProc.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><%@page import="com.jspsmart.upload.*, java.io.*, java.util.*" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>文件上传处理页</title></head><body><%SmartUpload smart = new SmartUpload();//初始化上传smart.initialize(pageContext);//准备上传smart.upload();Request smartReq = smart.getRequest();Date time = new Date();//为了防止用户上传的文件重复,用当前毫秒数作为保存的文件名String saveFileName = String.valueOf(time.getTime());session.setAttribute("saveFileName", saveFileName);for(int i=0;i<smart.getFiles().getCount();i++){//获取上传的文件com.jspsmart.upload.File file = smart.getFiles().getFile(i);//将文件以毫秒值为名称另存为应用下upload下的文件// 另存到操作系统的根目录为文件根目录的目录下//file.saveAs(request.getRealPath("/upload/"+saveFileName+".txt"),smart.SAVE_PHYSICAL);// 另存到以WEB应用程序的根目录为文件根目录的目录下//file.saveAs("/upload/"+saveFileName+".txt", smart.SAVE_VIRTUAL);file.saveAs("/upload/"+saveFileName+".txt");}request.getRequestDispatcher("download.jsp").forward(request, response);%></body></html>



下载部分:

下载页面 download.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><%@ page import="com.jspsmart.upload.*" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>文件下载</title></head><body><a href="downloadProc.jsp">下载</a></body></html>

处理下载的jsp downloadProc.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><%@ page import="com.jspsmart.upload.*" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>文件下载处理页</title></head><body><%//新建一个smartUploadSmartUpload smart = new SmartUpload();//初始化smart.initialize(pageContext);// 设定contentDisposition为null以禁止浏览器自动打开文件,//保证点击链接后是下载文件。若不设定,则下载的文件扩展名为//doc时,浏览器将自动用word打开它。扩展名为pdf时,//浏览器将用acrobat打开。smart.setContentDisposition(null);//下载文件smart.downloadFile(request.getRealPath("/upload/"+session.getAttribute("saveFileName")+".txt"));//smart.downloadFile("/upload/test.txt");//下面两行代码解决java.lang.IllegalStateException: getOutputStream() has already been called for this responseout.clear();out=pageContext.pushBody();%></body></html>


在试SmartUpload的下载的时候报了这个错误:

java.lang.IllegalStateException: getOutputStream() has already been called for this response

通过网上查找,找到了原因:

引用别人的说法:

由于jsp container在处理完成请求后会调用releasePageContet方法释放所用的PageContext object,并且同时调用getWriter方法,由于getWriter方法与在jsp页面中使用流相关的getOutputStream方法冲突,所以会造成这种异常,解决办法是:只需要在jsp页面的最后加上两条语句:  out.clear();out=pageContext.pushBody();即可(其中out,pageContext均为jsp内置对象!)



0 0
原创粉丝点击