整合了一个自己写的采用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"); } }
相关推荐
Java 中HttpURLConnection附件上传的实例详解 Java 中HttpURLConnection附件上传的实例详解是指通过使用Java语言中的HttpURLConnection类来实现附件上传的功能。本文将详细介绍HttpURLConnection附件上传的实例详解...
在本文中,我们将深入探讨如何使用HttpURLConnection实现文件上传,同时也会涉及普通参数的传递。 首先,我们需要理解HTTP请求的基本结构。HTTP请求通常由以下几个部分组成:请求行、请求头、空行和请求体。在文件...
其中,包含了响应的内容、状态码、状态消息、附件名称和附件内容。此类提供了相应的方法来获取和设置这些值。对于HTTP协议,响应代码是判断请求成功与否的关键,通常200系列的代码表示成功,而400和500系列的代码...
在Android应用开发中,将附件(如图片文件)上传到服务器是常见的功能需求。这个场景通常涉及到网络通信,特别是HTTP协议的使用。本篇将详细讲解如何在Android中实现图片文件的HTTP上传。 首先,我们需要了解HTTP...
Java QQ附件通常指的是使用Java编程语言开发的与QQ应用程序相关的组件或工具,这些组件可能用于处理QQ接收或发送的文件,比如实现自动化处理、文件上传下载等功能。在Java中,我们可以利用各种库和API来实现这样的...
在Android应用开发中,图片上传是一项常见的功能,尤其是在社交、媒体分享或云存储类的应用中。为了实现这一功能,开发者通常需要设计一个高效且可靠的图片上传队列Service。本篇文章将详细探讨如何创建一个名为...
文件上传通常涉及到网络请求,Android提供了多种方式来实现,如使用HttpURLConnection、HttpClient(已废弃)或第三方库如Volley、OkHttp等。以OkHttp为例,它是一个高效的HTTP客户端,支持异步和同步请求。创建一个...
在客户端,我们需要创建一个Multipart请求,通常使用`HttpURLConnection`或者第三方库如Apache HttpClient或OkHttp。客户端需要构造一个包含文件的`multipart/form-data`请求,并设置正确的边界。 5. **文件下载...
- **HTTP请求**:通常使用`HttpURLConnection`或第三方库如`OkHttp`、`Retrofit`发送POST请求,将文件内容作为请求体上传。 - **Multipart上传**:对于较大的文件,通常使用`multipart/form-data`格式上传,需要将...
可以使用`HttpURLConnection`或者第三方库如`Volley`、`OkHttp`等。 2. **文件读取**:使用`FileInputStream`读取本地文件内容,将其转换为字节数组或流形式。 3. **设置请求头**:在HTTP请求头中设置`Content-...
在Android应用开发中,将图片上传到服务器是常见的需求,特别是在社交、分享或者云端存储等场景。本知识点主要聚焦于如何实现从Android客户端上传图片到Servlet服务端的完整流程。 一、Android端处理 1. 图片选择...
在 Java 中,上传文件可以使用 `HttpURLConnection` 类,设置请求方法为 POST,并将文件内容写入到输出流中。例如,可以使用 `DataOutputStream` 将文件内容写入到输出流中。 使用 HttpURLConnection 实现文件上传 ...
DELETE HTTP request in HttpURLConnection Looks like not working - Stack Overflow_files`和`Upload a file using HTTP put in Java - Stack Overflow_files`这两个目录可能是相关问题的附件或者示例代码,包含...
文件上传在B/S应用中是一种十分常见的功能,那么在Android平台下是否可以实现像B/S那样的文件上传功能呢?答案是肯定的。下面是一个模拟网站程序上传文件的例子。...import java.net.HttpURLConnection; import java
根据请求参数找到要下载的文件,设置响应头Content-Disposition为attachment,指示浏览器以附件形式下载。 - **客户端**:在Android端,收到服务器返回的文件URL后,发起GET请求下载文件。使用DownloadManager或...
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服务器进行文件上传和图片下载的基本流程。在实际应用中,还需要考虑错误处理、安全策略(如防止文件覆盖...
- 文件选择:集成文件选择器,允许用户选择上传的附件。 - 文件上传:使用MultipartBody类处理文件上传到服务器的过程。 6. **搜索过滤**: - 实时搜索:在输入框中输入关键字时,实时更新邮件列表,这可能涉及...
Mime4j提供了解析和构建MIME消息的能力,包括解析消息头、处理附件、编码和解码内容等。在文件上传中,Mime4j可以帮助构造复杂的多部分POST请求,将文件内容转换为符合HTTP规范的格式。 `httpmime-4.0.1.jar`是...
需要注意的是,虽然在早期的Android版本中,HttpClient是官方推荐的网络通信库,但从Android 6.0(API级别23)开始,Google引入了更现代的`HttpURLConnection`作为首选的网络API。然而,由于HttpClient的成熟特性和...