HttpClient 传输文件的两种方式
Posted virgosnail
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HttpClient 传输文件的两种方式相关的知识,希望对你有一定的参考价值。
1. org.apache.commons.httpclient.HttpClient
package com.skd.util; import com.skd.common.Constant; import com.skd.common.Event; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.methods.multipart.FilePart; import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity; import org.apache.commons.httpclient.methods.multipart.Part; import org.apache.commons.httpclient.methods.multipart.StringPart; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.util.ArrayList; import java.util.List; /** * @Description * @Author virgosnail * @Date 2018/12/15 17:06 */ public class HttpUtil2 { private static Logger log = LoggerFactory.getLogger(HttpUtil2.class); /** * org.apache.commons.httpclient.HttpClient */ private static HttpClient httpClient = new HttpClient(); /** * @param event 0:删除 1:新增 2:修改 * @param file * @return * @Author Administrator * @Date 2018年11月11日 */ public static void doPostMethod(Event event, File file) { try { PostMethod post = new PostMethod(FileUtil.getURL()); post.setRequestHeader("Content-Type","application/json"); List<Part> list = new ArrayList<>(); list.add(new StringPart(Constant.TYPE, event.getValue())); list.add(new StringPart(Constant.RELATIVE_PATH, file.getPath())); if (!Event.FILE_DELETE.equals(event)) {
// list.add(new FilePart(Constant.FILE, file)); } Part[] parts = new Part[list.size()]; list.toArray(); post.setRequestEntity(new MultipartRequestEntity(parts, post.getParams())); log.info("request: " + post); httpClient.executeMethod(post); String response = post.getResponseBodyAsString(); log.info("respopnse: " + response); } catch (Exception e) { log.error("doPostMethod occur a exception", e); } } }
2. org.apache.http.client.HttpClient
package com.skd.util; import com.skd.common.Constant; import com.skd.common.Event; import net.sf.json.JSONObject; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.entity.mime.MultipartEntityBuilder; import org.apache.http.entity.mime.content.FileBody; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.nio.charset.Charset; /** * @Description * @Author virgosnail * @Date 2018/12/15 17:06 */ public class HttpUtil { private static Logger log = LoggerFactory.getLogger(HttpUtil.class); /** * org.apache.http.client.HttpClient; * 创建一个httpclient对象 */ private static HttpClient httpclient = HttpClients.createDefault(); /** * @param event 0:删除 1:新增 2:修改 * @param file * @return * @Author Administrator * @Date 2018年11月11日 */ public static void doPost(Event event, File file, boolean isDir, boolean hasFile) { try { // 创建http的发送方式对象,是GET还是POST String url = FileUtil.getURL(); HttpPost httppost = new HttpPost(url); log.info(" URL: " + url); httppost.addHeader("Charset",Constant.CHARSET); // 创建要发送的实体,就是key-value的这种结构,借助于这个类,可以实现文件和参数同时上传 MultipartEntityBuilder fileEntity = MultipartEntityBuilder.create(); // 设置编码 Charset charset = Charset.forName(Constant.CHARSET); fileEntity.setCharset(charset); // 追加要发送的文本信息并设置编码格式 fileEntity.addTextBody(Constant.TYPE, event.getValue(),ContentType.APPLICATION_JSON); log.info("type: " + event.getValue()); String relativePath = FileUtil.getRelativePath(file.getAbsolutePath()); fileEntity.addTextBody(Constant.RELATIVE_PATH, relativePath,ContentType.APPLICATION_JSON); log.info("relative_path: " + relativePath); fileEntity.addTextBody(Constant.ISDIR, String.valueOf(isDir),ContentType.APPLICATION_JSON); log.info("isDir: " + isDir); if (Event.FILE_CREATE.equals(event) || Event.FILE_CHANGE.equals(event)){ fileEntity.addPart(Constant.FILE, new FileBody(file,ContentType.APPLICATION_OCTET_STREAM)); } log.info("file: " + file); HttpEntity httpEntity = fileEntity.build(); httppost.setEntity(httpEntity); // 执行httppost对象并获得response HttpResponse response = httpclient.execute(httppost); // 状态码 int statusCode = response.getStatusLine().getStatusCode(); HttpEntity resEntity = response.getEntity(); // 获得返回来的信息,转化为字符串string String respopnse = EntityUtils.toString(resEntity); log.info("respopnse body: " + respopnse); } catch (Exception e) { log.error("doPost occur a exception", e); } } }
以上是关于HttpClient 传输文件的两种方式的主要内容,如果未能解决你的问题,请参考以下文章
《连载 | 物联网框架ServerSuperIO教程》- 10.持续传输大块数据流的两种方式(如:文件)