JavaEE--文件上传(十六)

一、文件上传(二进制上传)

  当数据以multipart/form-data的格式发送时,servlet容器支持文件上传。
  如果servlet容器提供multipart/form-data格式数据的处理,可通过HttpServletRequest中的以下方法得到:
public Collection getParts()获取所有的文件上传域。
public Part getPart(String name) 根据名称获取文件的上传域。
Part类代表从multipart/form-data格式的POST请求中接收到的一个部分或表单项。 每个part都可通过Part.getInputStream方法访问头部,相关的内容类型和内容。
表单enctype属性:

描述
application/x-www-form-urlencoded 在发送前编码所有字符(默认)
multipart/form-data 不对字符编码。在使用包含文件上传控件的表单时,必须使用该值。
text/plain 空格转换为 "+" 加号,但不对特殊字符编码。

A.@MultipartConfig注解属性

1.location属性被解析为一个绝对路径且默认为javax.servlet.context.tempdir。如果指定了相对地址,它将是相对于tempdir位置。
Location:指定存储所上传文件的目录分以下两种情况
1)若part.write(fileName)传的参数只有上传的文件名,那么最后文件就会被上传到location目录中若此时location所指定的目录不存在,则会报告下面的异常(Tomcat7.x启动时不会报)
java.io.IOException: The temporary upload location [D:\upload\22] is not valid

2)若part.write(savePath+"/"+fileName),则无论location是否指定目录,最后文件都会被上传到savePath,但是,如果此时location所指定的目录不存在,那么也会报告第一种情况中的异常,并导致上传文件失败。

2.fileSizeThreshold:设置阈值,达到阈值后会将所上传的文件从临时目录中写到磁盘..单位为byte,默认值是0
3.maxFileSize:允许上传的单个文件最大值,即不限制文件总数及总大小,只限制单个文件..单位为byte,默认值是-1,即无限制。

4.maxRequestSize:允许上传的文件的最大值,这里指的是一次性上传的所有文件的合计大小..单位也是byte,默认值是-1,即无限制。

B.上传页面:

<%@page language="java" contentType="text/html; charset=UTF-8"
 pageEncoding="UTF-8"%>




文件上传


  
  文件:  
说明:

C.上传Servlet:

/**
  * @MultipartConfig上传文件注解
  */
@WebServlet("/UploadServlet")
@MultipartConfig(fileSizeThreshold=1024*1024*2,  maxFileSize=1024*1024*20,  maxRequestSize=1024*1024*200)?
public  class  UploadServlet  extends  HttpServlet  {
  private  static  final  long  serialVersionUID  =  1L;
  public  UploadServlet()  {
  super();
  }

  /**
   * 上传方法
   */
  protected  void  doPost(HttpServletRequest  request,  HttpServletResponse  response)
  throws  ServletException,  IOException  {
  request.setCharacterEncoding("utf-8");
  //设置编码
  response.setCharacterEncoding("utf-8");
  response.setContentType("text/html;charset=utf-8");
  //获取文件对象
  Part  part  =  request.getPart("file");
  //header值为: form-data; name="file"; filename="xxx.txt"
  String  header  =  part.getHeader("content-disposition");
  //获取文件名,截取最后一个=与"之间的字符串,即文件名
  String  fileName  =  header.substring(header.lastIndexOf("=")+2,  header.lastIndexOf("\""));
  //文件上传
  part.write(getServletContext().getRealPath("/")+"upload\\"  +  fileName);
  PrintWriter  out  =  response.getWriter();
  out.println("head:content-disposition: "  +  header  +  "
"); out.println("文件名: " +fileName + "
"); out.println("文件域name:"+part.getName() + "
"); out.println("此文件的大小:"+part.getSize()+"
"); out.println("此文件类型:"+part.getContentType()+"
"); //获取文本框描述内容 out.println("说明:"+request.getParameter("name")+"
"); out.flush(); out.close(); } }

配置虚拟目录
在 tomcat 上配置图片虚拟目录,在 tomcat 下 conf/server.xml 中添加:

访问 http://localhost:8080/pic 即可访问 F:\develop\upload\temp 下的图片。

二、文件上传(Base64上传)

  1. 编码转换
/**
 * @描述: Base64图片转换
 */
public class Base64Pic {
    /**
     * 图片转化成base64字符串
     * 
     * @param imgFile
     * @return
     */
    public static String GetImageStr(String imgFile) {
        // 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
        InputStream in = null;
        byte[] data = null;
        // 读取图片字节数组
        try {
            in = new FileInputStream(imgFile);
            data = new byte[in.available()];
            in.read(data);
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new String(data);
    }

    /**
     * base64字符串转化成图片  
     * @param imgStr Base64字符
     * @param outPath 输出路径
     * @return
     */
    public static String GenerateImage(String imgStr, String outPath) { 
        System.out.println("aaa"+imgStr);
            // 对字节数组字符串进行Base64解码并生成图片
        if (imgStr == null)
            // 图像数据为空
            return "";
        try {
            Date date=new Date();
            // 生成jpeg图片
            String imgFilePath = outPath+"\\"+date.getTime()+".jpg";// 新生成的图片
            OutputStream out = new FileOutputStream(imgFilePath);
            out.write(imgStr.getBytes());
            out.flush();
            out.close();
            return imgFilePath;
        } catch (Exception e) {
            return "";
        }
    }
}
  1. HTML

    
    
    

  1. Servlet
//使用Base64编码上传
path = Base64Pic.GenerateImage(goodsPath, "文件路径");

你可能感兴趣的:(JavaEE--文件上传(十六))