博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaWeb 文件上传功能
阅读量:3949 次
发布时间:2019-05-24

本文共 5863 字,大约阅读时间需要 19 分钟。

JavaWeb 文件上传功能

1. 获取 Port 接口的集合

在Servlet3.0中,新增了Part 接口,可以方便的进行文件上传处理,可以通过 HttpServletRequest 对象的 getPart() 方法取得Part实现对象。

/** 源码 * This class represents a part as uploaded to the server as part of a * multipart/form-data request body. The part may represent either * an uploaded file or form data. * * @since Servlet 3.0 */public interface Part {......}
/**1. 获取 Port 接口的集合 * Part 接口:用于上传文件到服务器 * getParts() 方法:获取元素为 Part 接口的集合 * 页面请求的数据被封装到request域中的Part属性中 * */Collection
parts = req.getParts();

2. 添加 @MultipartConfig 标注

  • 在 Tomat 中要在 Servlet 上设置 @MultipartConfig 才能取得 Part 对象,否则 getPart() 会得到 null 结果。

  • @MultipartConfig 标注可用来设置 Servlet 处理上传文件的相关信息,如果没有设置属性则取默认值。

可用属性如下表

fileSizeThreshold 整数值,文件缓存的临界点,超过则先保存到临时目录,即缓存文件,默认值为0
location 字符串,写入文件时的目录,如果设置这个属性值,则缓存文件就是写到指定的目录,也可搭配 Part的 write() 方法使用,默认为空字符串
maxFileSize 限制上传文件大小,默认值为 -1L,表示无限制
maxRequestSize 限制 multipart/form-data 请求个数,默认值为-1L,表示不限制个数
@MultipartConfigpublic class Upload extends HttpServlet{......}

3. 在服务器中创建目录 /upload

/**3. 在服务器中创建存放上传文件的文件夹 /upload * 如果目录 /upload 不存的话,就通过File类的创建方法创建 * */String realPath = req.getServletContext().getRealPath("/upload");  //getServletContext().getRealPath() 也可以获取不存在的路径,返回的结果是一个拼成的路径System.out.println(realPath);boolean mkdirs = new File(realPath).mkdirs();  //将通过 ServletContext 域对象的 getRealPath() 方法获取的拼接路径,通过File类和mkdirs()方法创建出来

4. 遍历元素 Part 获取各自对应的头信息

/**4. 遍历元素 Part 获取各自对应的头信息 * 调用元素 Part 接口的 getHeader() 方法,获取前端form表单提交过来的头的详细信息 * 表单提交的头信息: * 在Mac系统中的表单提交的头(enctype="multipart/form-data")的信息        ------WebKitFormBoundaryw8aYcJlpgDXW7UpK          Content-Disposition: form-data; name="filenameSingle"; filename="配置.txt"          Content-Type: text/plain        ------WebKitFormBoundaryw8aYcJlpgDXW7UpK-- * */for (Part part : parts) {  String header = part.getHeader("Content-Disposition");  String filename = getFileName(header);  // 调用外界方法,获取字符串中的filename子字符串  if (null!=filename&&!"".equals(filename)) {//防止上传空文件    /**5. 执行上传     * 调用Part接口的write("upload路径"+"文件名")方法,上传到服务器的目录     * */    part.write(realPath+"/"+filename);  }}

5. 执行上传

if (null!=filename&&!"".equals(filename)) {//防止上传空文件,注意,这里比较空字符串不要用!=,否则会无法比较  /**5. 执行上传   * 调用Part接口的write("upload路径"+"文件名")方法,上传到服务器的目录   * */  part.write(realPath+"/"+filename);}

功能实现代码

Java 代码 - /demo/src/com/Upload.java

package com;import java.io.File;import java.io.IOException;import java.util.Collection;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.annotation.MultipartConfig;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.Part;/**2. 添加 @MultipartConfig 标注 */@MultipartConfigpublic class Upload extends HttpServlet{    @Override    public void init(ServletConfig config) throws ServletException {        super.init(config);    }    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        doPost(req, resp);    }    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        resp.setContentType("text/html;charset=utf-8");        /**1. 获取 Port 接口的集合         *  Part 接口:用于上传文件到服务器         *  getParts() 方法:获取元素为 Part 接口的集合         *  */        Collection
parts = req.getParts(); /**3. 在服务器中创建存放上传文件的文件夹 /upload * 如果目录 /upload 不存的话,就通过File类的创建方法创建 * */ String realPath = req.getServletContext().getRealPath("/upload"); //getServletContext().getRealPath() 也可以获取不存在的路径,返回的结果是一个拼成的路径 System.out.println(realPath); boolean mkdirs = new File(realPath).mkdirs(); //将通过 ServletContext 域对象的 getRealPath() 方法获取的拼接路径,通过File类和mkdirs()方法创建出来 /**4. 遍历元素 Part 获取各自对应的头信息 * 调用元素 Part 接口的 getHeader() 方法,获取前端form表单提交过来的头的详细信息 * 表单提交的头信息: * 在Mac系统中的表单提交的头(enctype="multipart/form-data")的信息 ------WebKitFormBoundaryw8aYcJlpgDXW7UpK Content-Disposition: form-data; name="filenameSingle"; filename="配置.txt" Content-Type: text/plain ------WebKitFormBoundaryw8aYcJlpgDXW7UpK-- */ for (Part part : parts) { String header = part.getHeader("Content-Disposition"); String filename = getFileName(header); // 调用外界方法,获取字符串中的filename子字符串 if (null!=filename&&!"".equals(filename)) {//防止上传空文件 /**5. 执行上传 * 调用Part接口的write("upload路径"+"文件名")方法,上传到服务器的目录 */ part.write(realPath+"/"+filename); } } resp.getWriter().write("

上传成功

"); } //防止恶意访问 public String getFileName(String header) { if(header!=null) { String[] split = header.split("="); String string = split[split.length-1]; String replace = string.replace("\"", ""); return replace; }else { return null; } } @Override public void destroy() { super.destroy(); }}

前端页面 jsp 代码 - /demo/WebContent/download.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
文件上传
单文件
多文件

web.xml - /demo/WebContent/WEB-INF/web.xml

demo
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
ServletContextName
ServletContextValue
Upload
com.Upload
Upload
/upload
15580222-40fb523b85422e44.png
上传成功,打印上传到的目录
15580222-f6fffed6c5fcadea.png
表单提交的头信息

转载地址:http://eghwi.baihongyu.com/

你可能感兴趣的文章
ADO查询站SQLServer,字段类型
查看>>
拼SQL语句执行更新
查看>>
MFC中使用ADO 插入Oracle,数据类型
查看>>
MFC使用ADO在Oracle中查重
查看>>
CH341SER_WIN7_X64 USB转串口驱动程序
查看>>
XDR-使用文件空间编码整数
查看>>
XDR-从文件空间解码整数
查看>>
XDR-.x文件的简单使用
查看>>
XDR-枚举的试用
查看>>
XDR -string的试用
查看>>
XDR-定长数组的使用
查看>>
xdr-union的试用
查看>>
XDR-初探XDR对变长类型空间的管理。--log
查看>>
XDR-变长类型数组-空间管理-log
查看>>
使用CppSQLite3访问SQLite数据库
查看>>
VS2008下使用CppSQLite3访问xgs黑名单表(SQLite数据库)
查看>>
第一个boost程序---timer的使用
查看>>
使用boost asio库实现字节数可控的CS通信
查看>>
linux下串口编程
查看>>
boot asio 非阻塞同步编程---非阻塞的accept和receive。
查看>>