`
重庆-卖菜
  • 浏览: 9726 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

Servlet3.0——文件上传

阅读更多
Servlet3.0文件上传

1.Sevlet3.0提供了一个新API来处理上传数据:

  • Annotation MultipartConfig:      A servlet can be annotated with this annotation in order to handlemultipart/form-data requests which contain file upload data. 
    通过这个注解标记一个Servlet 可以处理multipart/form-data请求包含的文件上传操作。
         annotation has the following options:
     
      • fileSizeThreshold: file’s size that is greater than this threshold will be directly written to disk, instead of saving in memory.
                                              如果上传的文件内容长度大于此值,将会写入磁盘而不保存在内存中。
      • location: directory where file will be stored via Part.write() method.
                           文件保存的本地路径
      • maxFileSize: maximum size for a single upload file.
                                 单次上传文件长度最大值,此值为字节
      • maxRequestSize:maximum size for a request.
                                        单次上传文件长度最大值,此值为字节

        所有size单位为字节,-1L表示不限制。1024*1024*10 = 10 MB

  • Interface Partrepresents a part in a multipart/form-data request. This interface defines some methods for working with upload data (to name a few):
      • getInputStream(): returns an InputStream object which can be used to read content of the part.
                                           获取上传文件的文件流
      • getSize(): returns the size of upload data, in bytes.
                             文件大小
      • write(String filename): this is the convenience method to save upload data to file on disk. The file is created relative to the location specified in the MultipartConfig annotation.
  •           New methods introduced in HttpServletRequest interface:
    • getParts(): returns a collection of Part objects
                  获取多个上传文件对象
    • getPart(String name): retrieves an individual Part object with a given name.
                                                               获取指定名name的上传文件对象。<input type="file" name="abc">

示例代码---服务端:

@WebServlet(urlPatterns = "/upload.html")
@MultipartConfig(fileSizeThreshold = 1024 * 1024 * 2, maxFileSize = 1024 * 1024 * 10, maxRequestSize = 1024 * 1024 * 50)
public class UploadFileServlet extends HttpServlet {
    private static final long    serialVersionUID    = 1L;
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("UploadFileServlet doPost invoked!");
        for (Part part : req.getParts()) {
            String fileName = extractFileName(part);
            part.write("D://xxx_"+fileName);
            
            /*
             * System.out.println("fileName=" + fileName); InputStream is =
             * null; OutputStream os = null; try { is = part.getInputStream();
             * os = new FileOutputStream(new File("D://xxx_" + fileName));
             * byte[] buf = new byte[1024]; int len = 0; while ((len =
             * is.read(buf)) != -1) { os.write(buf, 0, len); } } catch
             * (Exception e) { } finally { if (is != null) { os.close();
             * is.close(); } }
             */
        }
        resp.setCharacterEncoding("utf-8");
        resp.getWriter().println("上传文件成功!");
        resp.getWriter().close();
    }
    /**
     * Extracts file name from HTTP header content-disposition
     */
    private String extractFileName(Part part) {
        String contentDisp = part.getHeader("content-disposition");
        String[] items = contentDisp.split(";");
        for (String s : items) {
            if (s.trim().startsWith("filename")) {
                return s.substring(s.indexOf("=") + 2, s.length() - 1);
            }
        }
        return "";
    }
}  
客户端:此处使用Jsoup代码的方式上传文件,而不是通过浏览器。不熟悉Jsoup的可以参数我另一篇博文“HttpClient/Jsoup 请求
public static void main(String[] args) {
		InputStream is = null;
		try {
			String url = "http://localhost:8080/part1/upload.html";
			is = new FileInputStream(new File("D://abc.txt"));
			Response response = Jsoup.connect(url).data("gdr", "abcc.txt", is).method(Method.POST).execute();
			System.out.println(response.body());
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (is != null) {
				try {
					is.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
 
输出:
上传文件成功!  

注:该代码在Eclipse-Jetty插件中运行,一直没有将文件写入D://下。但在Tomcat中运行,一切正常。

造成这种现象很容易理解,Servlet为接口规范,其实现为各Web容器。

因此建议在保存文件时为了保证在各种Web容器中运行都有一至结果,建议通过Part接口获取文件输入流,自己实现文件保存功能。如示例中的注释。

分享到:
评论

相关推荐

    Servlet 3.0新特性——文件上传接口

    Servlet 3.0是Java EE 6规范的一...如果你想要深入了解Servlet 3.0的文件上传功能,可以通过阅读指定的博文链接(已提供但此处未显示)或者查阅相关的Java EE 6文档,进一步学习如何在实际项目中有效利用这些新特性。

    servlet3.0实现文件上传——demo1.zip

    本工程用于借助Servlet3.0实现文件上传 本工程编码方式:UTF-8 注意: 1、在上传文件前请在计算机C盘新建一个名为“upload”的文件夹,否则会出现如下异常:java.io.IOException: The temporary upload location [C...

    java上传与下载——struts2和servlet案例

    Servlet 3.0及以上版本引入了对多文件上传的支持,使得处理文件上传更加简洁。 对于下载部分,无论是Struts2还是Servlet,核心思路都是读取服务器上的文件内容,并将其写入到响应流中,以便客户端能够接收到并保存...

    java文件上传例子

    文件上传通常涉及到`Part`接口,这是Servlet 3.0及以上版本引入的,用于处理multipart/form-data类型的HTTP请求,这种类型常用于文件上传。 1. **multipart/form-data**: 这是一种HTTP请求内容类型,允许在表单数据...

    Spring_MVC_051:Spring MVC 学习总结(五)——校验与文件上传

    Spring MVC 学习总结(五)——校验与文件上传 目录 2.2.7、范围 2.2.8、其它注解 2.3、注解控制器参数 1.4、在UI中添加错误标签 1.5、测试运行 三、使用jQuery扩展插件Validate实现前端校验 3.1、jQuery扩展插件...

    org.springframework.web.servlet-3.0.0.M4.jar

    9. **上传文件支持**:通过MultipartFile接口,Spring MVC提供了一种优雅的方式来处理HTTP请求中的文件上传。 在org.springframework.web.servlet-3.0.0.M4.jar中,除了核心组件之外,还包括了Spring的许可证信息,...

    java IO流方式上传下载文件,源代码

    在Java中,我们可以使用Servlet API来处理HTTP请求,特别是`Part`接口,它是Servlet 3.0引入的,专门用于处理多部分表单数据(如文件上传)。首先,需要在HTML表单中设置`enctype="multipart/form-data"`,然后在...

    上传文件(jsp)

    描述提到,只需要将两个JSP文件放在同一目录下即可使用,这暗示了我们将分析这两个文件——doUpload.jsp和UploadExample.jsp——如何协同工作来处理文件上传请求。 首先,我们来理解JSP(JavaServer Pages)的基本...

    upload.jar

    《Java Web服务器文件上传——基于sun java jdk 1.4.2_08的upload.jar解析》 在Java Web应用程序开发中,文件上传是一项常见的功能需求,它允许用户将本地文件发送到Web服务器进行存储或处理。在这个场景中,...

    java上传组件含进度条

    Java上传组件是软件开发中一个重要的工具,尤其是在...在实际开发中,可以选择像Apache HttpClient、Servlet 3.0的Part API或者第三方库如JQuery File Upload、Resumable.js等,它们都提供了文件上传及进度显示的支持。

    Java web Android

    `Part`接口是Java Servlet 3.0引入的,用于处理multipart/form-data类型的请求,这是文件上传通常使用的格式。 3. **接收文件**:调用`Part`的`getInputStream()`方法获取文件流,然后将其写入到服务器的指定位置,...

    struts笔记

    3. **Servlet 3.0 的 Part**:Servlet 3.0规范中引入了一种新的文件上传机制——Part对象。尽管这种方式更为现代且功能强大,但由于兼容性问题,目前尚未得到广泛应用。 4. **COS (Commons Open Source)**:这是一个...

    ajax 上传图片

    - 在服务器端,需要处理`Part`对象,这是Servlet 3.0及以上版本中用于处理文件上传的部分。这部分代码可能涉及文件的临时存储、大小检查、文件类型验证等。 4. **工具应用** 在实际开发中,我们可能会使用一些库...

    JAVA WEB典型模块与项目实战大全

    第15章 在线文件上传和下载(struts 2.x+fileupload)  15.1 在线文件上传和下载模块原理  15.2 文件上传组件fileupload  15.3 初步使用文件上传组件(components-fileupload)  15.4 单文件的上传  15.5 多...

    Java网络程序员看Continuation

    1. **大文件上传/下载**:在用户上传大文件时,可以暂停处理并释放线程,直到文件传输完成再恢复处理。 2. **长时计算**:对于需要大量计算的任务,可以先保存当前状态,然后释放线程去做其他工作,待计算完成后再...

    springmvc-high-other-05.rar

    7. **上传下载支持**:SpringMVC内置了处理文件上传和下载的功能。通过MultipartFile接口,我们可以方便地处理用户提交的文件,同时,也可以通过StreamingResponseBody实现大文件的下载。 8. **RESTful风格的支持**...

    JAVA WEB典型模块与项目实战大全.part2(第二卷)

    第15章 在线文件上传和下载(Struts 2.X+FileUpload) 第16章 网上投票系统(Struts2.X+JFreeChat) 第17章 商业银行网上账户管理系统(Struts2.X) 第18章 Hibernate分页系统(Hibernate3.0) 第19章 生成保表...

    JAVA WEB典型模块与项目实战大全.part3(第三卷)

    第15章 在线文件上传和下载(Struts 2.X+FileUpload) 第16章 网上投票系统(Struts2.X+JFreeChat) 第17章 商业银行网上账户管理系统(Struts2.X) 第18章 Hibernate分页系统(Hibernate3.0) 第19章 生成保表...

    JAVA WEB典型模块与项目实战大全.part4

    第15章 在线文件上传和下载(Struts 2.X+FileUpload) 第16章 网上投票系统(Struts2.X+JFreeChat) 第17章 商业银行网上账户管理系统(Struts2.X) 第18章 Hibernate分页系统(Hibernate3.0) 第19章 生成保表...

Global site tag (gtag.js) - Google Analytics