`

HttpURLConnection附件上传

阅读更多

整合了一个自己写的采用Http做附件上传的工具,分享一下!

/**
 * 以Http协议传输文件
 * 
 * @author mingxue.zhang@163.com
 *
 */
public class HttpPostUtil {

	private final static char[] MULTIPART_CHARS = "-_1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
			.toCharArray();

	private URL url;
	private HttpURLConnection conn;
	private String boundary = null;
	private Map<String, String> textParams = new HashMap<String, String>();
	private Map<String, File> fileparams = new HashMap<String, File>();

	public HttpPostUtil(String url) throws Exception {
		this.url = new URL(url);
	}

	// 重新设置要请求的服务器地址,即上传文件的地址。
	public void setUrl(String url) throws Exception {
		this.url = new URL(url);
	}

	// 增加一个普通字符串数据到form表单数据中
	public void addTextParameter(String name, String value) {
		textParams.put(name, value);
	}

	// 增加一个文件到form表单数据中
	public void addFileParameter(String name, File value) {
		fileparams.put(name, value);
	}

	// 清空所有已添加的form表单数据
	public void clearAllParameters() {
		textParams.clear();
		fileparams.clear();
	}

	/**
	 * 发送数据到服务器
	 * 
	 * @return 一个字节包含服务器的返回结果的数组
	 * @throws Exception
	 */
	public byte[] send() throws Exception {
		initConnection();
		try {
			conn.connect();
		} catch (SocketTimeoutException e) {
			throw new Exception(e);
		}

		OutputStream connOutStream = new DataOutputStream(
				conn.getOutputStream());

		writeFileParams(connOutStream);
		writeStringParams(connOutStream);
		writesEnd(connOutStream);

		InputStream responseInStream = conn.getInputStream();
		ByteArrayOutputStream responseOutStream = new ByteArrayOutputStream();
		int len;
		byte[] bufferByte = new byte[1024];
		while ((len = responseInStream.read(bufferByte)) != -1) {
			responseOutStream.write(bufferByte, 0, len);
		}
		responseInStream.close();
		connOutStream.close();

		conn.disconnect();
		byte[] resultByte = responseOutStream.toByteArray();
		responseOutStream.close();
		return resultByte;
	}

	// 文件上传的connection的一些必须设置
	private void initConnection() throws Exception {
		StringBuffer buf = new StringBuffer("----");
		Random rand = new Random();
		for (int i = 0; i < 15; i++) {
			buf.append(MULTIPART_CHARS[rand.nextInt(MULTIPART_CHARS.length)]);
		}
		this.boundary = buf.toString();

		conn = (HttpURLConnection) this.url.openConnection();
		conn.setDoOutput(true);
		conn.setUseCaches(false);
		conn.setConnectTimeout(3 * 60 * 1000); // 连接超时为10秒
		conn.setRequestMethod("POST");
		conn.setRequestProperty("Content-Type",
				"multipart/form-data; boundary=" + boundary);
	}

	// 普通字符串数据
	private void writeStringParams(OutputStream out) throws Exception {
		Set<String> keySet = textParams.keySet();
		for (Iterator<String> it = keySet.iterator(); it.hasNext();) {
			String name = it.next();
			String value = textParams.get(name);

			out.write(("--" + boundary + "\r\n").getBytes());
			out.write(("Content-Disposition: form-data; name=\"" + name + "\"\r\n")
					.getBytes());
			out.write(("\r\n").getBytes());
			out.write((encode(value) + "\r\n").getBytes());
		}
	}

	// 文件数据
	private void writeFileParams(OutputStream out) throws Exception {
		Set<String> keySet = fileparams.keySet();
		for (Iterator<String> it = keySet.iterator(); it.hasNext();) {
			String name = it.next();
			File value = fileparams.get(name);

			out.write(("--" + boundary + "\r\n").getBytes());
			out.write(("Content-Disposition: form-data; name=\"" + name
					+ "\"; filename=\"" + encode(value.getName()) + "\"\r\n")
					.getBytes());
			out.write(("Content-Type: " + getContentType(value) + "\r\n")
					.getBytes());
			out.write(("Content-Transfer-Encoding: " + "binary" + "\r\n")
					.getBytes());

			out.write(("\r\n").getBytes());

			FileInputStream inStream = new FileInputStream(value);
			int bytes = 0;
			byte[] bufferByte = new byte[1024];
			while ((bytes = inStream.read(bufferByte)) != -1) {
				out.write(bufferByte, 0, bytes);
			}
			inStream.close();

			out.write(("\r\n").getBytes());
		}
	}

	// 添加结尾数据
	private void writesEnd(OutputStream out) throws Exception {
		out.write(("--" + boundary + "--" + "\r\n").getBytes());
		out.write(("\r\n").getBytes());
	}

	// 获取文件的上传类型,图片格式为image/png,image/jpg等。非图片为application/octet-stream
	private String getContentType(File f) throws Exception {
		String fileName = f.getName();
		if (fileName.endsWith(".jpg")) {
			return "image/jpeg";
		} else if (fileName.endsWith(".png")) {
			return "image/png";
		}
		return "application/octet-stream";
	}

	// 对包含中文的字符串进行转码,此为UTF-8。服务器那边要进行一次解码
	private String encode(String value) throws Exception {
		return URLEncoder.encode(value, "UTF-8");
	}

}

 

0
0
分享到:
评论

相关推荐

    Java 中HttpURLConnection附件上传的实例详解

    Java 中HttpURLConnection附件上传的实例详解 Java 中HttpURLConnection附件上传的实例详解是指通过使用Java语言中的HttpURLConnection类来实现附件上传的功能。本文将详细介绍HttpURLConnection附件上传的实例详解...

    Java自带的HttpURLConnection访问接口实现文件上传

    在本文中,我们将深入探讨如何使用HttpURLConnection实现文件上传,同时也会涉及普通参数的传递。 首先,我们需要理解HTTP请求的基本结构。HTTP请求通常由以下几个部分组成:请求行、请求头、空行和请求体。在文件...

    java android httpURLConnection的封装

    其中,包含了响应的内容、状态码、状态消息、附件名称和附件内容。此类提供了相应的方法来获取和设置这些值。对于HTTP协议,响应代码是判断请求成功与否的关键,通常200系列的代码表示成功,而400和500系列的代码...

    android 上传附件 http

    在Android应用开发中,将附件(如图片文件)上传到服务器是常见的功能需求。这个场景通常涉及到网络通信,特别是HTTP协议的使用。本篇将详细讲解如何在Android中实现图片文件的HTTP上传。 首先,我们需要了解HTTP...

    java QQ附件java QQ附件

    Java QQ附件通常指的是使用Java编程语言开发的与QQ应用程序相关的组件或工具,这些组件可能用于处理QQ接收或发送的文件,比如实现自动化处理、文件上传下载等功能。在Java中,我们可以利用各种库和API来实现这样的...

    Android图片上传队列Service

    在Android应用开发中,图片上传是一项常见的功能,尤其是在社交、媒体分享或云存储类的应用中。为了实现这一功能,开发者通常需要设计一个高效且可靠的图片上传队列Service。本篇文章将详细探讨如何创建一个名为...

    android文件上传控件

    文件上传通常涉及到网络请求,Android提供了多种方式来实现,如使用HttpURLConnection、HttpClient(已废弃)或第三方库如Volley、OkHttp等。以OkHttp为例,它是一个高效的HTTP客户端,支持异步和同步请求。创建一个...

    CXF之二(上传及下载附件)

    在客户端,我们需要创建一个Multipart请求,通常使用`HttpURLConnection`或者第三方库如Apache HttpClient或OkHttp。客户端需要构造一个包含文件的`multipart/form-data`请求,并设置正确的边界。 5. **文件下载...

    Android 文件上传Demo

    - **HTTP请求**:通常使用`HttpURLConnection`或第三方库如`OkHttp`、`Retrofit`发送POST请求,将文件内容作为请求体上传。 - **Multipart上传**:对于较大的文件,通常使用`multipart/form-data`格式上传,需要将...

    android上传文件,java服务器接收 客户端与服务器端两端上传代码

    可以使用`HttpURLConnection`或者第三方库如`Volley`、`OkHttp`等。 2. **文件读取**:使用`FileInputStream`读取本地文件内容,将其转换为字节数组或流形式。 3. **设置请求头**:在HTTP请求头中设置`Content-...

    上传图片服务端

    在Android应用开发中,将图片上传到服务器是常见的需求,特别是在社交、分享或者云端存储等场景。本知识点主要聚焦于如何实现从Android客户端上传图片到Servlet服务端的完整流程。 一、Android端处理 1. 图片选择...

    Java 发送http请求上传文件功能实例

    在 Java 中,上传文件可以使用 `HttpURLConnection` 类,设置请求方法为 POST,并将文件内容写入到输出流中。例如,可以使用 `DataOutputStream` 将文件内容写入到输出流中。 使用 HttpURLConnection 实现文件上传 ...

    HTTP PUT相关资料

    DELETE HTTP request in HttpURLConnection Looks like not working - Stack Overflow_files`和`Upload a file using HTTP put in Java - Stack Overflow_files`这两个目录可能是相关问题的附件或者示例代码,包含...

    简单实现Android文件上传

    文件上传在B/S应用中是一种十分常见的功能,那么在Android平台下是否可以实现像B/S那样的文件上传功能呢?答案是肯定的。下面是一个模拟网站程序上传文件的例子。...import java.net.HttpURLConnection; import java

    安卓+servlet上传下载图片

    根据请求参数找到要下载的文件,设置响应头Content-Disposition为attachment,指示浏览器以附件形式下载。 - **客户端**:在Android端,收到服务器返回的文件URL后,发起GET请求下载文件。使用DownloadManager或...

    Java上传下载文件并实现加密解密

    HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setDoOutput(true); conn.connect(); int responseCode = conn.getResponseCode(); if (response...

    文件上传下载

    // 设置附件名 readfile('images/image.jpg'); // 读取图片文件并输出 ``` 以上代码展示了Android端通过PHP服务器进行文件上传和图片下载的基本流程。在实际应用中,还需要考虑错误处理、安全策略(如防止文件覆盖...

    Android应用源码之仿QQ邮箱安卓客户端项目.zip

    - 文件选择:集成文件选择器,允许用户选择上传的附件。 - 文件上传:使用MultipartBody类处理文件上传到服务器的过程。 6. **搜索过滤**: - 实时搜索:在输入框中输入关键字时,实时更新邮件列表,这可能涉及...

    apache-mime4j-0.6.jar and httpmime-4.0.1.jar.zip

    Mime4j提供了解析和构建MIME消息的能力,包括解析消息头、处理附件、编码和解码内容等。在文件上传中,Mime4j可以帮助构造复杂的多部分POST请求,将文件内容转换为符合HTTP规范的格式。 `httpmime-4.0.1.jar`是...

    安卓httpclient用到的两个包

    需要注意的是,虽然在早期的Android版本中,HttpClient是官方推荐的网络通信库,但从Android 6.0(API级别23)开始,Google引入了更现代的`HttpURLConnection`作为首选的网络API。然而,由于HttpClient的成熟特性和...

Global site tag (gtag.js) - Google Analytics