import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Random;
import org.apache.commons.httpclient.methods.multipart.Part;
import org.apache.http.Header;
import org.apache.http.entity.AbstractHttpEntity;
import org.apache.http.message.BasicHeader;
import org.apache.http.params.HttpParams;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EncodingUtils;
public class MultipartEntity extends AbstractHttpEntity {
private static final String MULTIPART_FORM_CONTENT_TYPE = "multipart/form-data";
public static final String MULTIPART_BOUNDARY = "http.method.multipart.boundary";
private static byte[] MULTIPART_CHARS = EncodingUtils
.getAsciiBytes("-_1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
private static byte[] generateMultipartBoundary() {
Random rand = new Random();
byte[] bytes = new byte[rand.nextInt(11) + 30]; // a random size from 30
// to 40
for (int i = 0; i < bytes.length; i++) {
bytes[i] = MULTIPART_CHARS[rand.nextInt(MULTIPART_CHARS.length)];
}
return bytes;
}
protected Part[] parts;
private byte[] multipartBoundary;
private HttpParams params;
private boolean contentConsumed = false;
public MultipartEntity(Part[] parts, HttpParams params) {
if (parts == null) {
throw new IllegalArgumentException("parts cannot be null");
}
if (params == null) {
throw new IllegalArgumentException("params cannot be null");
}
this.parts = parts;
this.params = params;
}
public MultipartEntity(Part[] parts) {
setContentType(MULTIPART_FORM_CONTENT_TYPE);
if (parts == null) {
throw new IllegalArgumentException("parts cannot be null");
}
this.parts = parts;
this.params = null;
}
protected byte[] getMultipartBoundary() {
if (multipartBoundary == null) {
String temp = null;
if (params != null) {
temp = (String) params.getParameter(MULTIPART_BOUNDARY);
}
if (temp != null) {
multipartBoundary = EncodingUtils.getAsciiBytes(temp);
} else {
multipartBoundary = generateMultipartBoundary();
}
}
return multipartBoundary;
}
public boolean isRepeatable() {
for (int i = 0; i < parts.length; i++) {
if (!parts[i].isRepeatable()) {
return false;
}
}
return true;
}
public void writeTo(OutputStream out) throws IOException {
Part.sendParts(out, parts, getMultipartBoundary());
}
public Header getContentType() {
StringBuffer buffer = new StringBuffer(MULTIPART_FORM_CONTENT_TYPE);
buffer.append("; boundary=");
buffer.append(EncodingUtils.getAsciiString(getMultipartBoundary()));
return new BasicHeader(HTTP.CONTENT_TYPE, buffer.toString());
}
public long getContentLength() {
try {
return Part.getLengthOfParts(parts, getMultipartBoundary());
} catch (Exception e) {
return 0;
}
}
public InputStream getContent() throws IOException, IllegalStateException {
if (!isRepeatable() && this.contentConsumed) {
throw new IllegalStateException("Content has been consumed");
}
this.contentConsumed = true;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Part.sendParts(baos, this.parts, this.multipartBoundary);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
return bais;
}
public boolean isStreaming() {
return false;
}
}
分享到:
相关推荐
在Android中,我们可以通过创建MultipartEntity来实现这个功能,它允许我们在一个请求中包含多个部分,每个部分可以是一个单独的文件。 1. 使用HTTP协议: Android提供了一个HttpURLConnection类,它支持HTTP和...
`httpmime-4.0.jar`包含了`MultipartEntity`类,这个类是实现文件上传的核心,允许我们构建一个包含多个部分的HTTP实体,其中可以包含文件内容和其他POST参数。 在Android中使用HttpClient进行文件上传的步骤通常...
文件数据通常被封装成MultiPartEntity或RequestBody,然后在请求体中发送。 2. **文件下载**:文件下载同样需要网络请求,但数据是流向客户端。Android提供了DownloadManager系统服务,可以方便地进行文件下载。...
本文将详细解析如何在Android系统中实现文件上传,主要围绕"Android文件上传"这一主题展开,结合提供的博客链接以及压缩包内的示例代码(test和struts2fileupload)进行说明。 首先,理解文件上传的基本流程至关...
在Android应用程序中,`HttpClient`经常被用于实现网络通信,比如上传或下载文件。下面将详细讨论`HttpClient`在Android中的应用及其相关知识点。 一、`HttpClient`基础 1. `HttpClient`类:它是整个框架的核心,...
如上文所示,添加`<uses-permission android:name="android.permission.INTERNET"/>`以允许应用访问互联网,同时如果使用Apache HttpClient,还需要在某些版本的Android中声明`<uses-library>`来引入相应的库。...
Struts2、Android和HttpClient是三个关键的技术领域,它们在本次文件上传的场景中相互结合。Struts2是一个流行的Java Web框架,用于构建MVC(模型-视图-控制器)结构的应用程序。Android是Google开发的移动操作系统...
在Android应用开发中,"多张照片上传"是一项常见的功能,尤其在社交、分享类应用中尤为关键。这里我们主要探讨如何实现这个功能,重点在于使用自定义的HttpClient以及通过输入流和输出流处理图片文件。 首先,...
`AsyncTask`是Android提供的轻量级异步处理类,适用于执行耗时但不频繁的任务。`Handler`/`Looper`则可以创建一个后台线程来处理消息,适用于需要长期运行的任务。 二、HttpClient介绍 Apache HttpClient是一个强大...
6. **权限请求**: 在Android应用中,为了访问设备的文件系统,需要在AndroidManifest.xml中添加读取外部存储的权限,即`<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />`。...
在Android开发中,文件的上传和下载是常见的功能需求,特别是在移动互联网应用中。这个"android文件上传下载源码"的资源提供了实现这些功能的代码示例,对于开发者来说是宝贵的参考资料。以下将详细讲解Android文件...
在Android平台上进行文件上传至C#服务器是一项常见的任务,尤其在移动应用开发中,比如图片分享、文件同步等场景。本项目提供了一个直接可用的解决方案,无需修改代码或配置即可运行,大大简化了开发流程。 首先,...
在Android开发中,网络编程是不可或缺的一部分,尤其是在Android 4.0时代,它为开发者提供了丰富的功能和优化的性能。本资源包含7个具体的项目,旨在深入解析Android 4.0网络编程的各种技术和实践,帮助开发者提升...
首先,创建一个包含图片文件的MultipartEntity,然后设置HTTP请求头,最后发送请求并将响应处理。 5. **PHP服务器端处理** `upload_image.php`是PHP脚本,负责接收上传的图片。在服务器端,我们需要验证请求是否...
在Java Web应用中,Servlet是一个Java类,用于扩展服务器的功能,处理客户端(这里是Android设备)的请求。在文件上传的场景下,Servlet会接收到POST请求,从中读取文件内容,然后可能进行保存、处理或其他操作。 ...
对于现代的Android项目,这通常是通过在build.gradle文件中添加依赖项来完成的,但在较旧的项目中,可能需要手动将这些jar文件放入项目的lib目录并配置构建路径。 2. 创建HttpClient实例:创建一个`HttpClient`对象...
在Android Studio中,可以将该jar包添加到项目的`libs`目录下,然后在`build.gradle`文件中配置依赖,确保构建系统能识别并使用这个库: ```groovy dependencies { implementation files('libs/httpmime.jar') } `...
在Android应用开发中,有时需要将用户在设备上拍摄或选择的图片文件上传到服务器进行存储、处理或分享。这个过程通常涉及到网络通信,而PHP作为服务器端的脚本语言,常用于处理这些请求。本项目是关于如何利用...
3. **配置授权流程**:在应用中初始化SDK,设置App Key、App Secret,并配置授权回调处理类。通常,你需要创建一个Activity来处理OAuth授权后的回调。 4. **引导用户授权**:当用户触发分享功能时,启动授权流程。...
在Android应用开发中,HTTP网络传输是至关重要的组成部分,它允许应用程序与远程服务器进行数据交换。本项目"AndroidHTTP网络传输文件程序"专注于演示如何在Android设备上通过HTTP协议实现文件的下载和上传操作。 ...