您的位置:首页 > Web前端 > JavaScript

JSP/Servlet文件上传下载

2014-04-14 23:47 357 查看
文件的上传和下载都是Web应用程序中很常见的功能,比如在论坛中用户可以上传自己的喜欢的头像,邮件系统中用户可以上传附件,到网站上去下载自己喜欢的资源等等。文件的上传也是基于表单来完成的,表单中的file元素可以自动生成一个文本框和一个按钮,文本框可以输入本地文件名或路径,点击按钮则可以打开一个文件选择框让用户选中本地文件。需要注意的是在文件上传时还必须设置表单的enctype属性,并将它的值设置为multipart/form-data。

upload.jsp

<%@pagelanguage="java"pageEncoding="UTF-8"%>
<%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
<html>
<head>
<title>文件上传</title>
</head>
<body>
<c:iftest="${param.codeeq'001'}">
<divstyle="color:red">上传成功!</div>
</c:if>
<c:iftest="${param.codeeq'002'}">
<divstyle="color:red">上传失败!</div>
</c:if>
<formaction="uploadServlet"method="post"enctype="multipart/form-data">
照片描述:<inputtype="text"name="desc"/><br/>
<inputtype="file"name="file1"/><br/>
<inputtype="submit"value="提交"/>
</form>
</body>
</html>

uploadServlet.java

importjava.io.File;importjava.io.IOException;importjava.text.SimpleDateFormat;importjava.util.Date;importjava.util.Iterator;importjava.util.List;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.apache.commons.fileupload.FileItem;importorg.apache.commons.fileupload.FileUpload;importorg.apache.commons.fileupload.disk.DiskFileItemFactory;publicclassUploadServletextendsHttpServlet{privatefinalStringuploadPath="C:/file/";//用于存放上传文件的目录privatefinalStringtempPath="C:/tempFile";//用于存放临时文件的目录privatefinalintflushSize=1024*512;//缓冲区大小privatefinallongfileSize=10*1024*1024;//文件最大大小publicvoidinit()throwsServletException{Filefile=newFile(uploadPath);if(!file.exists()){file.mkdir();}file=newFile(tempPath);if(!file.exists()){file.mkdir();}}publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{//判断from表单的enctype属性值是否设置为multipart/form-databooleanisMultipart=FileUpload.isMultipartContent(request);if(!isMultipart){return;}try{DiskFileItemFactoryfactory=newDiskFileItemFactory();//设置缓冲区大小factory.setSizeThreshold(flushSize);factory.setRepository(newFile(tempPath));//创建FileUpload对象FileUploadupload=newFileUpload(factory);//设置文件最大大小upload.setSizeMax(fileSize);Listitems=upload.parseRequest(request);Iteratoriter=items.iterator();while(iter.hasNext()){FileItemitem=(FileItem)iter.next();//判断是否是file表单元素if(!item.isFormField()){Stringname=item.getName();//获得文件路径及名称name=name.substring(name.lastIndexOf(File.separator)+1,name.length());//获得文件名StringfileType=name.substring(name.indexOf("."));//获得文件后缀名Stringfilename=getFileName();//随机产生一个文件名防止文件名重复longsize=item.getSize();//如果文件名不存在则不处理if((name==null||name.equals(""))&&size==0){continue;}item.write(newFile(uploadPath+filename+fileType));}else{//获得文件描述Stringdesc=item.getString("UTF-8");System.out.println(desc);}}response.sendRedirect("upload.jsp?code=001");}catch(Exceptione){e.printStackTrace();response.sendRedirect("upload.jsp?code=002");}}privateStringgetFileName(){//根据时间产生文件名SimpleDateFormatdf=newSimpleDateFormat("yyyyMMddhhmmssms");returndf.format(newDate());}publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{doGet(request,response);}}

文件下载:

通过超链接下载文件,会暴露了下载文件在服务器中的真实地址,不利于对资源进行安全保护,而且利用超链接下载文件,服务器端得文件只能存放在Web应用程序所在的目录下。利用程序编码实现下载,可以增加安全机制,比如我们只能让VIP会员下载等等。还可以从任意位置进行下载,我们可以将文件放到Web应用程序以外的目录中。显示文件夹内所有文件的servlet:
importjava.io.File;importjava.io.IOException;importjava.util.ArrayList;importjava.util.List;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;publicclassShowFileServletextendsHttpServlet{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{Stringpath="c:/file";//声明集合存放目录下所有文件的文件名List<String>fileList=newArrayList<String>();Filefolder=newFile(path);//判断文件夹是否存在并且是否是一个目录if(folder.exists()&&folder.isDirectory()){//获得目录中所有文件及目录File[]files=folder.listFiles();for(Filefile:files){//如果是文件if(file.isFile()){//将文件名放入集合中fileList.add(file.getName());}}}request.setAttribute("fileList",fileList);request.getRequestDispatcher("showfile.jsp").forward(request,response);}publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{doGet(request,response);}}

showfile.jsp

<%@pagelanguage="java"pageEncoding="UTF-8"%><%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%><!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"><html><head><title>显示所有文件</title></head><body>请选择您要下载的文件:<br/><c:forEachitems="${fileList}"var="fileName"><ahref="downLoadServlet?filename=${fileName}">${fileName}</a><br/></c:forEach></body></html>

DownLoadServlet.java

importjava.io.BufferedInputStream;importjava.io.BufferedOutputStream;importjava.io.File;importjava.io.FileInputStream;importjava.io.IOException;importjava.io.InputStream;importjavax.servlet.ServletException;importjavax.servlet.ServletOutputStream;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;publicclassDownLoadServletextendsHttpServlet{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{Stringpath="C:/file";StringfileName=request.getParameter("filename");Filefile=newFile(path+"/"+fileName);//如果文件存在if(file.exists()){//设置响应类型及响应头response.setContentType("application/x-msdownload");response.addHeader("Content-Disposition","attachment;filename=\""+fileName+"\"");//读取文件InputStreaminputStream=newFileInputStream(file);BufferedInputStreambis=newBufferedInputStream(inputStream);byte[]bytes=newbyte[1024];ServletOutputStreamoutStream=response.getOutputStream();BufferedOutputStreambos=newBufferedOutputStream(outStream);intreadLength=0;while((readLength=bis.read(bytes))!=-1){bos.write(bytes,0,readLength);}//释放资源inputStream.close();bis.close();bos.flush();outStream.close();bos.close();}}publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{doGet(request,response);}}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: