zoukankan      html  css  js  c++  java
  • multipart/form-data请求与文件上传

    要上传文件,需要用post方法,并且设置enctype为multipart/form-data。

    <form action="/upload" method="post" enctype="multipart/form-data">
      <input type="text" name="param1">
      <input type="text" name="param2">
      <input type="file" name="fileparam">
      <button type="submit">上传</button>
    </form>

    关于multipart/form-data

    multipart/form-data与post方法结合,用了multipart/form-data的post请求与普通的post请求的请求头和请求体都有不同。

    普通post请求头中Content-Type字段值为:

    Content-Type: application/x-www-form-urlencoded

    multipart/form-data请求头中Content-Type字段值为multipart/form-data; boundary=xxxxxxx, (xxxxxx规定了请求体中的内容分隔符)。

    Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryZpsWTsOiRHI0TBW7

    普通post请求的请求体格式为(不会上传文件内容):

    param1=AAAA&param2=123456&fileparam=test.txt

    而multipart/form-data请求体格式为(包含文件内容):

    ------WebKitFormBoundaryjUVXJ3PslTEBh9as
    Content-Disposition: form-data; name="param1"
    
    AAAA
    ------WebKitFormBoundaryjUVXJ3PslTEBh9as
    Content-Disposition: form-data; name="param2"
    
    123456
    ------WebKitFormBoundaryjUVXJ3PslTEBh9as
    Content-Disposition: form-data; name="fileparam"; filename="test.txt"
    Content-Type: text/plain
    
    contents of file
    ------WebKitFormBoundaryjUVXJ3PslTEBh9as

    后台处理

    使用multipart/form-data提交的数据使用HttpServletRequest对象的getParameter()等方法无法读取。可以读取整个请求体数据流自己解析数据。但更好的方式是使用已经有的第三方工具类,如fileupload,jspsmartupload。下面的例子中使用的是fileupload。

    HttpServletRequeest request=....
    if(ServletFileUpload.isMultipartContent(request)) 
    { FileItemFactory factory
    = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); List<FileItem> items = upload.parseRequest(request); for(FileItem i: items) { i.getFieldName();   //参数名 //i.getString();   //参数值(返回字符串),如果是上传文件,则为文件内容      //i.get();   //参数值(返回字节数组),如果是上传文件,则为文件内容
         //i.getSize();     //参数值的字节大小     
    //i.getName();     //上传文件的文件名      //i.getContentType(); //上传文件的内容类型      if(!i.isFormField()&&i.getSize()>0)   //简单参数返回true,文件返回false       Files.write(Paths.get("/upload/"+Paths.get(i.getName()).getFileName()), i.get());   }
    }
  • 相关阅读:
    bzoj 1121: [POI2008]激光发射器SZK 思维_结论
    bzoj 1189: [HNOI2007]紧急疏散evacuate 分层图最大流 + 拆点 + 二分
    luogu 3467 [POI2008]PLA-Postering 单调栈
    BZOJ1143: [CTSC2008]祭祀river 网络流_Floyd_最大独立集
    BZOJ 1123: [POI2008]BLO 求割点+乘法原理+计数
    bzoj 1191: [HNOI2006]超级英雄Hero 网络流 + 残量网络
    无题
    numpy模块(对矩阵的处理,ndarray对象)
    python面向过程编程
    logging模块,程序日志模板
  • 原文地址:https://www.cnblogs.com/pixy/p/4868188.html
Copyright © 2011-2022 走看看