java文件上传和下载
2014-04-01 14:50
381 查看
一、文件上传
1.Commons方式文件上传
首先导入包commons-fileupload-1.2.jar和commons-io-1.3.2.jar,web文件上传使用post方式,设置form的enctype属性为multipart/form-data由于上传的文件会比较大,因此需要设置该参数指定浏览器使用二进制上传。提交上传文件后可以在提交过去的页面获得一个输入流request.getInputStream()输入流中时文件的字节码,可以将其包装为字符流输出。
文件上传首先要定义一个对象:
DiskFileItemFactory dfif=newDiskFileItemFactory();
在该对象中设置两个属性:
dfif.setSizeThreshold(1024*1024); //文件上传时缓存得最大容量
dfif.setRepository(new File(path));//当上传文件大于缓存容量时暂存到该目录下。
String path=request.getRealPath("/upload");//获得当前应用下WebRoot下一个文件夹的路径。
通过factory构造一个ServletFileUpload对象实现文件上传:
ServletFileUpload sfu=new ServletFileUpload(dfif);
获得提交的每个元素的信息:
List<FileItem> list=sfu.parseRequest(request);
遍历list找出不是普通文本域的表单元素信息:
if(!fileItem.isFormField()){ //判断是否文普通文本域
获得文件名:
String value = fileItem.getName();
int stat = value.lastIndexOf("\\");
String filename=value.substring(stat+1);
将文件写入到指定路径:
fileItem.write(new File(path,filename));//直接将文件写入指定的路径
获得表单的名字:fileItem.getFieldName()
获得表单里面的内容:fileItem.getString()
如下例子:
jsp中设置代码:
servlet中代码:
2.jspSmart文件上传
首先导入包jspsmartuploadUTF-8.jar
jsp中代码:
servlet中代码:
3.struts中文件上传,一定要注意在action中添加文件属性、文件类型属性、文件名称属性且这些属性的名字是固定写法,前半部分时jsp中上传表单中file的name属性,后半部分是固定的写法。当上传多个文件时,action中定义的属性就是数组形式。
jsp中代码:
action中代码:其主要目的就是将action中得到file文件写入到本地文件中,也可以用流的方式先获得inputStream然后将inputStream中的内容写入到outputStream中进而输出到本地文件中。
4.文件上次进度条实现原理
实现原理时服务器在处理上传文件的同时,将上传进度的信息例如文件长度、已上传多少、传送速率等写入Session中。客户端浏览器利用Ajax技术再新开一个独立的线程从Session中获取上传进度信息,并实时显示,Ajax技术能够不刷新页面获取服务器数据。
二、文件下载
1.servlet中文件下载:
读取web应用中的资源时:用servletContext去获取,可以获得资源的流,也可以获取资源的路径。
首先获得下载文件的路径和名字
根本思路就是将服务器的资源写到写入到response的outPutStream中在servlet的doPost方法中实现下面代码
下载本地文件
下载网络文件
2.smart实现文件下载
3.支持在线打开文件
1.Commons方式文件上传
首先导入包commons-fileupload-1.2.jar和commons-io-1.3.2.jar,web文件上传使用post方式,设置form的enctype属性为multipart/form-data由于上传的文件会比较大,因此需要设置该参数指定浏览器使用二进制上传。提交上传文件后可以在提交过去的页面获得一个输入流request.getInputStream()输入流中时文件的字节码,可以将其包装为字符流输出。
文件上传首先要定义一个对象:
DiskFileItemFactory dfif=newDiskFileItemFactory();
在该对象中设置两个属性:
dfif.setSizeThreshold(1024*1024); //文件上传时缓存得最大容量
dfif.setRepository(new File(path));//当上传文件大于缓存容量时暂存到该目录下。
String path=request.getRealPath("/upload");//获得当前应用下WebRoot下一个文件夹的路径。
通过factory构造一个ServletFileUpload对象实现文件上传:
ServletFileUpload sfu=new ServletFileUpload(dfif);
获得提交的每个元素的信息:
List<FileItem> list=sfu.parseRequest(request);
遍历list找出不是普通文本域的表单元素信息:
if(!fileItem.isFormField()){ //判断是否文普通文本域
获得文件名:
String value = fileItem.getName();
int stat = value.lastIndexOf("\\");
String filename=value.substring(stat+1);
将文件写入到指定路径:
fileItem.write(new File(path,filename));//直接将文件写入指定的路径
获得表单的名字:fileItem.getFieldName()
获得表单里面的内容:fileItem.getString()
如下例子:
jsp中设置代码:
<form action="/firstWeb/UploadServlet"method="post" enctype="multipart/form-data"> <label>请选择上传文件:</label> <input type="file"name="file1"><br/> <label>请选择上传文件:</label> <input type="file"name="file2"><br/> <label>请输入第一个文件简介:</label> <input type="text" name="description1"><br> <label>请输入第二个文件简介:</label> <input type="text"name="description2"><br> <input type="submit"value="上传"> </form>
servlet中代码:
Stringfile1=null,file2=null,description1=null,description2=null; DiskFileItemFactory dfif=new DiskFileItemFactory(); Stringpath=getServletContext().getRealPath("/upload"); //获得应用下WebRoot下的文件目录 dfif.setRepository(newFile(path));//设定目录用来暂时存放文件是大于配置的尺寸 dfif.setSizeThreshold(1024*1024);//设定阈值超过此文件大小都写直接到磁盘 ServletFileUpload sfu=newServletFileUpload(dfif); sfu.setSizeMax(1024*10);//设置允许上传文件的最大值 sfu.setSizeMax(1024*10*10);//设置上传总量大小 //sfu.setHeaderEncoding("UTF-8");//文件名出现中文乱码使用 //显示文件上传进度 ProgressListener progressListener= new ProgressListener() { publicvoid update(long pBytesRead, long pContentLength, int pItems) { System.out.println("到现在为止, " +pBytesRead + " 字节已上传,总大小为 " + pContentLength); } }; sfu.setProgressListener(progressListener); try { List<FileItem>list=sfu.parseRequest(request);//获得request提交的所有表单信息 for(FileItemfileItem:list){ if(!fileItem.isFormField()){ //判断是否文普通文本域 Stringname =fileItem.getFieldName(); if(name.equals("file1")){ file1=name; } if(name.equals("file2")){ file2=name; } //获得文件的名字 Stringvalue = fileItem.getName(); intstat = value.lastIndexOf("\\"); Stringfilename =value.substring(stat+1); fileItem.write(newFile(path, filename));//直接将文件写入指定的路径 }else{ if("description1".equals(fileItem.getFieldName())){ description1=newString(fileItem.getString().getBytes(),"UTF-8"); }elseif ("description2".equals(fileItem.getFieldName())) { description2=newString(fileItem.getString().getBytes(),"UTF-8"); } } } }catch (Exception e) { e.printStackTrace(); }
2.jspSmart文件上传
首先导入包jspsmartuploadUTF-8.jar
jsp中代码:
<formaction="SmartUploadServlet" method="post"enctype="multipart/form-data"> <input type="file"name="file1"><input type="submit" value="确定"> </form>
servlet中代码:
request.setCharacterEncoding("UTF-8"); String path=this.getServletContext().getRealPath("/upload"); SmartUpload su=new SmartUpload(); //su.setAllowedFilesList("");//设置允许上传指定扩展名的文件否则抛出异常 //su.setDeniedFilesList("");//设置禁止上传指定扩展名的文件 //su.setMaxFileSize(1024*1024*10);//设置允许上传的每个文件的最大长度 //su.setTotalMaxFileSize(1024*1024*20);//设置一次允许上传的所有文件的最大长度 su.initialize(getServletConfig(),request,response); try { su.upload(); //Requestreq=su.getRequest();//取得Request对象,以便由此对象取得文件表单内容 Filesfs= su.getFiles();//获得上传文件的列表 //fs.getCollection();//Collection集合形式获得上传文件列表 //fs.getEnumeration();//获得文件类表的枚举 //fs.getCount();//文件列表的长度 //fs.getSize();//文件列表中文件总长度 Filef=fs.getFile(0);//获得类表中指定序列的文件 Stringfilename=f.getFileName();//获取被上传的文件名 //filename=newString(filename.getBytes("ISO-8859-1"),"UTF-8"); //booleanb=f.isMissing();//判断用户是否上传了文件 //Stringfieldname=f.getFieldName();//此上传文件的表单项name //Stringext=f.getFileExt();//获取被上传文件的扩展名 //Stringfullname=f.getFilePathName();//获取上传文件的全名含目录 System.out.println(filename); //intn=f.getSize();//获取上传文件的长度 f.saveAs("/upload/"+filename,SmartUpload.SAVE_VIRTUAL);//将文件另存为(第一个是另存为相对本应用的路径加上文件名) //su.save("/upload", SmartUpload.SAVE_VIRTUAL);//保存相对本应用的路径不加文件名 } catch (SmartUploadException e) { e.printStackTrace(); }
3.struts中文件上传,一定要注意在action中添加文件属性、文件类型属性、文件名称属性且这些属性的名字是固定写法,前半部分时jsp中上传表单中file的name属性,后半部分是固定的写法。当上传多个文件时,action中定义的属性就是数组形式。
jsp中代码:
<form enctype="multipart/form-data" action="${pageContext.request.contextPath}/xxx.action" method="post"> <input type="file"name="uploadImage"> </form>
action中代码:其主要目的就是将action中得到file文件写入到本地文件中,也可以用流的方式先获得inputStream然后将inputStream中的内容写入到outputStream中进而输出到本地文件中。
public class HelloWorldAction{ private File uploadImage;//得到上传的文件 private String uploadImageContentType;//得到文件的类型 private String uploadImageFileName;//得到文件的名称 //这里略省了属性的getter/setter方法 public Stringupload() throws Exception{ Stringrealpath = ServletActionContext.getServletContext().getRealPath("/images"); Filefile = new File(realpath); if(!file.exists()) file.mkdirs(); FileUtils.copyFile(uploadImage,new File(file, uploadImageFileName)); return"success"; } }
4.文件上次进度条实现原理
实现原理时服务器在处理上传文件的同时,将上传进度的信息例如文件长度、已上传多少、传送速率等写入Session中。客户端浏览器利用Ajax技术再新开一个独立的线程从Session中获取上传进度信息,并实时显示,Ajax技术能够不刷新页面获取服务器数据。
二、文件下载
1.servlet中文件下载:
读取web应用中的资源时:用servletContext去获取,可以获得资源的流,也可以获取资源的路径。
首先获得下载文件的路径和名字
String path = this.getServletContext().getRealPath( "/download/Koala.jpg"); String filename =path.substring(path.lastIndexOf("\\") + 1); //如果下载文件是中文名称文件,则文件名需经过url编码 filename = URLEncoder.encode(filename, "UTF-8"); //设置浏览器弹出对话框提示下载此文件 response.setHeader("content-disposition","attachment;filename="+filename); //使用response的getOutputStream方法获得到浏览器的输出流 FileInputStream fis = newFileInputStream(new File(path)); OutputStream out =response.getOutputStream(); byte[] b = new byte[512]; int n = 0; while ((n = fis.read(b)) != -1) { out.write(b,0,n); } fis.close(); out.close();
根本思路就是将服务器的资源写到写入到response的outPutStream中在servlet的doPost方法中实现下面代码
String name =request.getParameter("name");//获得要下载的文件名字 Stringfilename = new String(name.getBytes("ISO-8859-1"),"UTF-8"); Stringpath =getServletContext().getRealPath("/upload/" + filename +"");//要下载文件路径 filename=URLEncoder.encode(filename,"UTF-8");//如果下载文件名称时中文用url编码 response.reset(); response.setContentType("");//通知浏览器不是普通文本文件和HTML文件而是下载文件 response.setHeader("content-disposition","attachment;filename=" +filename);//通知浏览器接收文件 FileInputStreamfis = new FileInputStream(new File(path)); OutputStreamout = response.getOutputStream(); byte[]b = new byte[1024]; intn = 0; while((n = fis.read(b)) != -1) { out.write(b,0, n); } fis.close(); out.close(); return;
下载本地文件
public HttpServletResponsedownload(String path, HttpServletResponse response) { try { // path是指欲下载的文件的路径。 File file = new File(path); // 取得文件名。 String filename = file.getName(); // 取得文件的后缀名。 String ext =filename.substring(filename.lastIndexOf(".") + 1).toUpperCase(); // 以流的形式下载文件。 InputStream fis = new BufferedInputStream(newFileInputStream(path)); byte[] buffer = newbyte[fis.available()]; fis.read(buffer); fis.close(); // 清空response response.reset(); // 设置response的Header response.addHeader("Content-Disposition","attachment;filename=" + new String(filename.getBytes())); response.addHeader("Content-Length", "" +file.length()); OutputStream toClient = newBufferedOutputStream(response.getOutputStream()); response.setContentType("application/octet-stream"); toClient.write(buffer); toClient.flush(); toClient.close(); } catch (IOException ex) { ex.printStackTrace(); } return response; } public void downloadLocal(HttpServletResponseresponse) throws FileNotFoundException { // 下载本地文件 String fileName ="Operator.doc".toString(); // 文件的默认保存名 // 读到流中 InputStream inStream = newFileInputStream("c:/Operator.doc");// 文件的存放路径 // 设置输出的格式 response.reset(); response.setContentType("bin"); response.addHeader("Content-Disposition","attachment; filename=\"" + fileName + "\""); // 循环取出流中的数据 byte[] b = new byte[100]; int len; try { while ((len = inStream.read(b)) > 0) response.getOutputStream().write(b, 0, len); inStream.close(); } catch (IOException e) { e.printStackTrace(); } }
下载网络文件
public voiddownloadNet(HttpServletResponse response) throws MalformedURLException { // 下载网络文件 int bytesum = 0; int byteread = 0; URL url = newURL("windine.blogdriver.com/logo.gif"); try { URLConnection conn = url.openConnection(); InputStream inStream = conn.getInputStream(); FileOutputStream fs = newFileOutputStream("c:/abc.gif"); byte[] buffer = new byte[1204]; int length; while ((byteread = inStream.read(buffer)) !=-1) { bytesum += byteread; System.out.println(bytesum); fs.write(buffer, 0, byteread); } } catch (Exception e) { e.printStackTrace(); } }
2.smart实现文件下载
publicvoid doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException { //Stringfilename=newString(request.getParameter("filename").getBytes("ISO-8859-1"),"UTF-8"); Stringfilename=request.getParameter("filename"); System.out.println(filename); SmartUploadsu=new SmartUpload(); su.initialize(getServletConfig(),request,response); su.setContentDisposition(null); //设定contentDisposition为null以禁止浏览器自动打开文件, //保证点击链接后是下载文件。若不设定,则下载的文件扩展名为 //doc时,浏览器将自动用word打开它。扩展名为pdf时, //浏览器将用acrobat打开。 try { su.downloadFile("/upload/"+filename); }catch (SmartUploadException e) { e.printStackTrace(); } }
3.支持在线打开文件
public void downLoad(StringfilePath, HttpServletResponse response, boolean isOnLine) throws Exception { File f = new File(filePath); if (!f.exists()) { response.sendError(404, "Filenot found!"); return; } BufferedInputStream br = newBufferedInputStream(new FileInputStream(f)); byte[] buf = new byte[1024]; int len = 0; response.reset(); // 非常重要 if (isOnLine) { // 在线打开方式 URL u = newURL("file:///" + filePath); response.setContentType(u.openConnection().getContentType()); response.setHeader("Content-Disposition","inline; filename=" + f.getName()); // 文件名应该编码成UTF-8 } else { // 纯下载方式 response.setContentType("application/x-msdownload"); response.setHeader("Content-Disposition", "attachment;filename=" + f.getName()); } OutputStream out =response.getOutputStream(); while ((len = br.read(buf)) > 0) out.write(buf, 0, len); br.close(); out.close(); }
相关文章推荐
- Java中的堆内存与栈内存
- 配置Java Web虚拟目录(Tomca…
- JAVA EE Eclipse下配置T…
- 如何在Eclipse中显示行号
- win7下安装jdk(以32位系统为例)
- javaWeb如何提高并发数
- Java webservice学习与总结
- Java日期转换SimpleDateFormat格式大全
- java 图片上传
- java的链表
- Java编程最差实践
- java jdk 安装 环境配置 及 错误处理
- Java 枚举7常见种用法
- All About JAVA An invalid XML character (Unicode: 0xdd65) was found in the comment 错误
- 【Java】将字符串转化为整数
- java中通过反射遍历属性字段及值
- Dom4J解析XML和创建XML文件
- java中通过反射遍历属性字段及值
- Eclipse的找bug插件
- java 权限修饰符