文件的上传下载
来源:互联网 发布:知乎 不知道诊所 编辑:程序博客网 时间:2024/06/05 04:25
实现上传
在实现上传前需要导入相关的jar包
commons-beanutils-1.8.3.jar
commons-fileupload-1.2.2.jar
commons-io-1.4.jar
commons-logging-1.1.1.jar
主要分为是三个步骤:
- 得到DiskFileItemFactory工厂类,可以添加参数,文件超过多少kb便在本地缓存例如
DiskFileItemFactory factory = new DiskFileItemFactory(20*1024, new File(“c:/c/temp”)); - 得到解析器ServletFileUpload对象
在解析对象之前,设置上传的文件大小
stu.setFileMaxSize(); - 调用解析器方法,parseRequst(),获得FileItem集合
在保存文件的目录中,我们一般保存WEB-INF目录下,目的是不让浏览器轻易访问到。我们在得到文件名后,应该对其做两个处理,一是文件同名问题,二是截取“//”之后的内容。随后之后采用哈希打散的方式保存文件,步骤如下:
- 利用文件名转换成一个十进制的哈希值,在转换成十六进制
- 取文件根目录和十六进制的哈希值的前两个字符作为新的文件路径
- 创建目录链
- 创建文件目录并保存
注意:我们可以利用ileUploadBase.FileSizeLimitExceededException抛出异常,将文件过大的信息保存起来,并传送给客户端
import java.io.File;import java.io.IOException;import java.io.PrintWriter;import java.util.List;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.FileItem;import org.apache.commons.fileupload.FileUploadBase;import org.apache.commons.fileupload.FileUploadException;import org.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;import cn.itcast.commons.CommonUtils;public class FileUploadServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /* * 避免乱码 */ request.setCharacterEncoding("utf-8"); response.setContentType("text/html;chartset=utf-8"); /* * 上传三步骤 * 1.获取工厂DiskFileItemFactory * 2.获取解析器 ServletFileUpload * 3.解析request,获得fileItem对象 */ DiskFileItemFactory factory=new DiskFileItemFactory(); //DiskFileItemFactory factory = new DiskFileItemFactory(20*1024, new File("c:/f/temp")); ServletFileUpload sfu=new ServletFileUpload(factory); //sfu.setFileSizeMax(200*1024);//设置上传文件大小 try { List<FileItem> list=sfu.parseRequest(request); FileItem fi=list.get(1); /* * 将上传的文件保存到web——inf目录下 * 1、用this.getServletContenxt获得files的真实路径 * 2。获得上传的文件名,fi.getName(); * 处理文件名:1.对“//”进行截取 * 2.处理同名问题 * 3.目录打散处理(5步奏) * 1.获取目录的哈希值 * 2.将哈希值转换成十六进制 * 3.创建文件的目录 * 4.目录建构 * 5.文件的写入 */ String filepath=this.getServletContext().getRealPath("/WEB-INF/files/");//获得真实路径 String filename=fi.getName();//获得上传文件名 /* * 对文件名截取“//“之后的内容 */ int index=filename.lastIndexOf("//"); if(index!=-1){ filename=filename.substring(index+1); } filename=CommonUtils.uuid()+"_"+filename;//防止文件重名 /* * 采用哈希打散的方式 */ int hash=filename.hashCode(); String hex=Integer.toHexString(hash); File file=new File(filepath,hex.charAt(0)+"/"+hex.charAt(1));//生成一个完整的路径 file.mkdirs();//创建目录链 File distFile=new File(file,filename);//创建文件目录 fi.write(distFile); try { fi.write(distFile); } catch (FileUploadException e) { if(e instanceof FileUploadBase.FileSizeLimitExceededException){ request.setAttribute("msg", "您要传送的文件大于20kb"); request.getRequestDispatcher("/test.jsp").forward(request, response); } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
文件的下载:
文件的下载比上传简单的多,简二言之就是两个头,一个流
- 获得Context-Type头
String ContextType=this.getServletContext.getMimeName(); - 获得Context-Disposition头
String ContentDisposition=”attachment;filename=”+filename
并要设置头 request.setHeader();
3.FileInputStream input = new FileInputStream(filename);
最后获取一个绑定响应的流
ServletOutputStrean output=request.getOutputStream();
注意,为防止下载的文件乱码,
String fileName=new String(“xxxx”.getBytes(“GBK”),”ISO-8859-1”)
例子
import java.io.FileInputStream;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.io.IOUtils;public class DownServlst extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String filename="d:/野子.mp3"; String farmename=new String("野子.mp3".getBytes("gbk"),"iso-8859-1");//防止下载的文件乱码 /* * 准备两个头,一个流 * 1.contentType * 2.contentPosition * 3.流下载文件的数据 */ String contentType=this.getServletContext().getMimeType(filename);//通过文件名获得MIME类型 String contentDisposition="attachment;filename="+farmename; FileInputStream in=new FileInputStream(filename);//一个流 //设置头 response.setHeader("Content_type", contentType); response.setHeader("Content-Disposition", contentDisposition); ServletOutputStream out=response.getOutputStream();//获取了绑定响应端的流 IOUtils.copy(in, out); in.close(); }}
“`
0 0
- 文件的上传下载示例
- 文件的上传下载
- 文件的上传下载
- 文件的上传下载
- 文件上传下载的例子
- 文件的上传下载
- 文件的上传下载
- structs2 文件的上传下载
- struts2的文件上传下载
- 文件上传下载的shellcode
- Java 文件的上传下载
- PHP文件的上传下载
- java 文件的上传下载
- 文件的上传下载
- PHP:文件的上传下载
- 文件的上传下载
- 文件上传下载的原理
- 文件的上传下载
- 栈堆
- UVA 10256 (计算几何 凸包)
- Python 一篇学会多线程
- 成员变量局部变量构造函数
- ARM的位置无关程序设计
- 文件的上传下载
- Home Server
- Hibernate一级和二级缓存
- 近日工作小结_2015年11月11日0:10:48
- select poll epoll iocp kqueue
- 黑马程序员——Java基本语法总结
- 程显峰:保障双11不掉“底裤”的5种安全武器
- zzuli OJ 1117: 查找数组元素
- c++中将文件内容清空