一、文件上传
1.准备工作:
1)表单提交方式为post
2)表单的enctype="multipart/form-data"
3)input 的type="file"
注:enctype属性表示在请求发送到服务器之前应该如何对表单数据进行处理
默认值为:application/x-www-form-urlencoded
1)application/x-www-form-urlencoded
在发送到服务器之前,所有字符都会进行编码
(空格为“+”,特殊符号转为ASCII HEX值)。
2)mutipart/form-data:不对字符编码,在使用包含文件上传控件的表单时,
必须使用该值
3)text/plain
空格转“+”,加号,但不对特殊字符编码。
2.通过request.getInpuStream 获取上传数据
protected void doGet(HttpServletRequest request ,HttpServletResponse response) throws ServletException , IOException { String name = request.getParameter("name"); //name==null;无法像普通表单控件的数据 ServletInpuStream inputStream = request.getInputStream(); byte[] buff = new byte[1024]; int len = inputStream.read(buff); String str = new String(buff ,0 ,len); }
3.通过fileupload组件进行上传
导入相关jar文件:
commons-fileupload-1.2.1.jar
commons-io-14.jar
核心类
DiskFileItemFactory:
创建FileItem对象的工厂
这个工厂的常用方法:
//构造函数 public DiskFileItemFactory(int sizeThreshold, java.io.File repository) //设置内存缓冲区的大小,默认值为10k。当上传文件大于缓冲区大小时, fileupload组件将使用临时文件缓存上传文件。单位:字节 public void setSizeThreshold(int sizeThreshold) //指定临时文件目录 public void setRepository(java.io.File repository)
ServletFileUpload:
负责处理上传的文件数据,并将表单中没个输入项封装成一个FileItem对象中。主要方法
//判断上传表单是否为multipart/form-data类型 boolean isMultipartContent(HttpServletRequest request) //解析request对象,并把表单中的每一个输入项包装成一个fleItem对象,并返回一个保存了所有FileItem的list集合。 List parseRequest(HttpServletRequest request) //设置上传文件的最大值 setFileSizeMax(long fileSizeMax) //设置上传文件的最大值 setFileSizeMax(long sizeMax) //设置上传文件总量的最大值 setSizeMax(long sizeMax) //设置编码格式 setHeaderEncoding(java.lang.String encoding) //设置监听 setProgressListener(ProgressListener pListener)
执行步骤
1)创建DiskFileItemFactory对象
FileItemFactory factory = new DiskFileItemFactory();
2)使用DiskFileItemFactory 对象创建ServletFileUpload对象
ServletFileUpload upload = new ServletFileUpload(factory)
3)判断表单是否是multipart/form-data类型
ServletFileUpload isMultipartContent(request)
4)调用parseRequest方法解析request对象,获取保存所有上传内容(FileItem对象)的List对象
5)对list进行迭代,调用其isFormField方法判断是否是上传文件
6)设置存放文件路径,保存文件
protected void doGet(HttpServletRequest request ,HttpServletResponse response) throws ServletException , IOException{ //创建文件上传的工厂类对象 FileItemFactory factory = new DiskFileItemFactory(); //根据工厂类对象创建ServletFileUpload对象 ServletFileUpload upload = new ServletFileUpload(factory); //解决文件名的中文乱码问题 upload.setHeaderEncoding("utf-8"); //判断表单的类型是否是multpart/form-data if(ServletFileUpload.isMultipartContent(request){ try{ //将请求参数转换为FileItem对象的集合 List<FileItem> items = (List<FileItem>)upload.parseRequest(request); for(FileItem fileItem : items){ //判断是否是普通的表单控件数据 if(fileItem.isFormField()){ //得到表单中name属性的值 fileItem.getFieldName(); //得到表单参数的值 //指定编码方式,解决提交数据的中文乱码 fileItem.getString("utf-8"); } else { fileItem.getFieldName(); fileItem.getName(); String path = "D:/upload"; File dir = new File(path); //如果文件夹不存在,创建 if(!dir.exists()){ dir.mkdir(); } String name = fileItem.getName(); Date date = new Date(); long time = date.getTime(); //得到文件的名称和后缀 String fileName = name.substring(0 ,name.lastIndexOf(".")); String ext = name.substring(name.lastIndexOf(".")+1); name = fileName + "-" + time + "." + ext; //创建上传文件的File对象 File file = new File(path ,name); //保存文件 fileItem.write(file); //删除临时文件 fileItem.delete(); } } }catch (FileUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }) }
二、文件下载
1.通过超连接下载
<a href="file/哈哈.rar>下载</a>
2.通过代码方式
本质上是通过流进行文件的拷贝,由于要下载的文件可以是任意类型,所以需要通过字节流进行处理
步骤:
1)获取要下载的文件的输入流
2)设置响应头的Content-Disposition的值
response.setHeader("Context-Disposition","attachment;filename="+fileName);
表示将请求所得的内容存为一个文件的时候提供一个默认的文件名
3)通过response得到输出流
4)通过IO流进行文件的拷贝
5)关闭流
protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{ String fileNme = request.getParaemter("name"); File file = new File("D/upload" ,fileName); FileInputStream in = new FileInputStream(file); //如果文件名中包含中文,需要进行URL编码 fileName = URLEncoder.encode(fileName ,"utf-8"); //设置content-Disposition response.setHeader("Content-Disposition " , "attachment;filename=" + fileName); } ServletOutputStream outputStream = response.getOutputStream(); byte[] buff = new byte[1024]; int len = -1; while((len = in.read(buff))!=-1){ outputStream.write(buff,0,len); } in.close(); outputStream.close();