本文讲解多文件上传方法,不比较上传有几种方法和效率,而是定向分析apache的httpmime包的MultipartEntityBuilder类,源码包:httpmime-4.5.2.jar
目录
1.多文件上传常用用法
2.注意点
=======正文分割线===========
一、常用用法
1.上传文件
三个传值方法,addPart、addBinaryBody、addTextBody如下图:
1 MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create(); 2 entityBuilder.addBinaryBody("file",new byte[]{},ContentType.DEFAULT_BINARY,"file.jpg"); 3 entityBuilder.addPart("owner","111"); 4 entityBuilder.addTextBody("paramter1", "aaa");
2.接收文件
1 //将当前上下文初始化给 CommonsMutipartResolver (多部分解析器) 2 CommonsMultipartResolver multipartResolver=new CommonsMultipartResolver(request.getSession().getServletContext()); 3 //判断是否多文件上传 4 if(multipartResolver.isMultipart(request)){ 5 //将request变成多部分request 6 MultipartHttpServletRequest multiRequest=(MultipartHttpServletRequest)request; 7 Map<String,Object> map=multiRequest.getParameterMap(); 8 //获取multiRequest 中所有的文件名 9 Iterator<String> iter=multiRequest.getFileNames(); 10 //遍历所有文件 11 while(iter.hasNext()){ 12 MultipartFile file=multiRequest.getFile(iter.next().toString()); 13 //to do 14 } 15 }
二、注意点
注意点1,使用addBinaryBody的坑
首先看看源码:
MultipartEntityBuilder 的 addBinaryBody 有6种不同用法,一般都是上传File即可。着重看下图2个红色名字的方法。
源码如下:
1 public MultipartEntityBuilder addBinaryBody( 2 final String name, final byte[] b, final ContentType contentType, final String filename) { 3 return addPart(name, new ByteArrayBody(b, contentType, filename)); 4 } 5 6 public MultipartEntityBuilder addBinaryBody( 7 final String name, final byte[] b) { 8 return addBinaryBody(name, b, ContentType.DEFAULT_BINARY, null); 9 } 10 11 public MultipartEntityBuilder addBinaryBody( 12 final String name, final File file, final ContentType contentType, final String filename) { 13 return addPart(name, new FileBody(file, contentType, filename)); 14 } 15 16 public MultipartEntityBuilder addBinaryBody( 17 final String name, final File file) { 18 return addBinaryBody(name, file, ContentType.DEFAULT_BINARY, file != null ? file.getName() : null); 19 } 20 21 public MultipartEntityBuilder addBinaryBody( 22 final String name, final InputStream stream, final ContentType contentType, 23 final String filename) { 24 return addPart(name, new InputStreamBody(stream, contentType, filename)); 25 } 26 27 public MultipartEntityBuilder addBinaryBody(final String name, final InputStream stream) { 28 return addBinaryBody(name, stream, ContentType.DEFAULT_BINARY, null); 29 }
如上图:需要特别注意 传byte[]字节数组时,必须使用4参传值,且第四参必须带后缀名:
entityBuilder.addBinaryBody("file",new byte[]{},ContentType.DEFAULT_BINARY,"fileName.jpg");
如果使用上图中两参的,最后fileName不传,默认为null,会导致接收文件时multiRequest.getFileNames()(见1.2接收方法代码)为空!就会获取不到文件!
注意点2 isMultipart:
multipartResolver.isMultipart(request),这里判断是否为多文件上传,要求
1.方法为POST。
2.contentType以"mutipart/"开头。源码追踪如下:
相关推荐
以下是一个使用`MultipartEntityBuilder`进行文件上传的基本步骤: 1. **导入依赖**:在Android Studio项目中,可以通过Gradle添加依赖: ```gradle dependencies { implementation 'org.apache.httpcomponents:...
在Android开发中,文件上传,特别是图片上传,是常见的需求之一。这涉及到用户选择本地文件,通常是图片,然后通过网络接口将这些文件发送到服务器。本文将深入探讨如何实现Android平台上的多文件和单文件上传,以及...
在文件上传时,HttpClient允许将文件内容作为请求体的一部分发送,这通常是通过MultipartEntityBuilder或者FormBodyPart来实现的,它们可以封装文件流并设置适当的边界以符合多部分表单数据的格式。 服务端部分则在...
在实际开发中,你还需要考虑错误处理和异常捕获,确保在文件上传过程中遇到问题时能够妥善处理。此外,如果SharePoint的访问控制较为严格,可能需要使用ADAL(Active Directory Authentication Library)来获取访问...
在Android应用开发中,有时需要将用户在设备上拍摄或选择的图片文件上传到服务器进行存储、处理或分享。这个过程通常涉及到网络通信,而PHP作为服务器端的脚本语言,常用于处理这些请求。本项目是关于如何利用...
在Android平台上进行文件上传是一项常见的任务,特别是在移动应用中,用户可能需要上传照片、文档等数据到服务器。本文将深入探讨如何在Android中实现批量文件上传,并结合SpringMVC服务端进行演示。我们将讨论两种...
在Java Swing中模拟文件上传是一项常见的任务,尤其在开发桌面应用程序时。Swing是一个用于创建图形用户界面(GUI)的Java库,它提供了丰富的组件和工具来构建功能强大的桌面应用。在这个场景中,我们将深入探讨如何...
HttpClient 4 版本引入了许多改进,使得文件上传变得更加简单和高效。在这个主题中,我们将深入探讨HttpClient 4如何实现文件上传,以及相关的核心概念和技术。 首先,我们需要了解HttpClient 4的基本用法。...
在HTTPClient中,文件上传通常涉及使用`MultipartEntityBuilder`或`HttpEntityEnclosingRequestBase`类。你需要创建一个multipart/form-data格式的请求体,然后将文件流添加到请求中。RESTful服务端通常会提供一个...
Java文件上传是Web应用开发中常见的功能,涉及用户通过网页上传文件到服务器。在这个场景下,`primefaces-6.2.jar`, `commons-fileupload.jar`, 和 `jersey-multipart-1.19.4.jar` 这些jar包扮演着关键角色。以下是...
PostMethod是HttpClient中用于执行POST请求的类,适合用来提交数据,包括文件上传。 二、PostMethod上传文件 1. 文件读取:首先,我们需要读取本地文件内容,通常使用FileInputStream或BufferedReader等流式API。 2...
在Android应用开发中,文件上传是一项常见的任务,无论是图片、文档还是其他类型的文件,都需要将它们从客户端(手机端)发送到服务器进行处理或存储。本教程将详细讲解如何实现Android客户端的文件上传,以及服务端...
下面将详细介绍如何使用Java实现文件上传功能。 1. **HTTP协议与文件上传** 文件上传通常基于HTTP或HTTPS协议,尤其是HTTP的POST方法。POST请求允许客户端向服务器发送数据,包括文件内容。在Java中,可以使用`...
在IT行业中,文件上传是常见的功能之一,尤其是在Web应用程序中。SpringMVC作为一个强大的MVC框架,提供了便捷的方式来处理文件上传。本示例主要探讨如何使用SpringMVC实现在不同服务器之间的文件上传,以实现文件...
在处理文件上传时,我们通常需要设置请求方法为POST或PUT,并使用`setDoOutput(true)`开启输出流,以便向服务器发送数据。 Servlet是Java Web开发中的重要组件,用于接收和响应HTTP请求。在处理文件上传时,Servlet...
以下是使用Apache HttpClient进行文件上传的一个基本步骤: 1. 引入依赖:在项目中添加Apache HttpClient库,如果使用Maven,可以在pom.xml中添加以下依赖: ```xml <groupId>org.apache.httpcomponents ...
本文将详细讲解三种文件上传方法,包括单文件上传和多文件上传,并涉及进度条的实现,这些都是安卓开发中的核心知识点。 1. **单文件上传** 单文件上传通常通过HTTP或HTTPS协议进行,可以使用Android的`...
本资源提供了完整的安卓图片上传和文件上传的解决方案,包括JSP服务端源码,使得开发者能够更好地理解和实现这一过程。以下是相关的知识点详解: 1. **Android客户端上传** - **Android SDK中的HttpURLConnection*...
它提供了丰富的功能,包括文件上传和下载,支持请求流,以及处理JSON和XML数据。在本例中,我们关注的是HTTPClient 4版本,这是一个稳定且功能强大的版本,适用于多种网络交互场景。 文件上传通常涉及到HTTP的POST...
1. **MultipartEntityBuilder**: 在HttpClient中,文件上传通常使用MultipartEntityBuilder来创建多部分实体(MIME类型为multipart/form-data)。这个实体包含了表单数据和要上传的文件内容。 2. **HttpPost**: ...