本章来尝试使用HttpClient方式上传文件到远程服务器:
我们在之前的文章中已经在SpringMVC基础框架的基础上应用了BootStrap的后台框架,在此基础上记录HttpURLConnection上传文件到远程服务器。
应用bootstrap模板
基础项目源码下载地址为:
SpringMVC+Shiro+MongoDB+BootStrap基础框架
我们在基础项目中已经做好了首页index的访问。
现在就在index.jsp页面和index的路由Controller上做修改,HttpClient上传文件到远程服务器。
客户端HttpClient上传文件到远程服务器的原理是通过构造参数模仿form提交文件的http请求,把文件提交到远程服务器的接收路由中。
index.jsp的代码为:
<%@ include file="./include/header.jsp"%>
<div id="page-wrapper">
<div id="page-inner">
<div class="row">
<div class="col-md-12">
<h1 class="page-header">
HttpURLConnection <small>HttpURLConnection</small>
<!-- /. ROW -->
<form class="form-horizontal" name="upform" action="upload" method="post" enctype="multipart/form-data">
<div class="form-group">
<label for="sourceModule" class="col-sm-2 control-label">上传文件:</label>
<div class="col-sm-10">
<input type="file" name="filename"/><br/>
<input type="submit" value="提交" /><br/>
</form>
<!-- /. ROW -->
<!-- /. PAGE INNER -->
<!-- /. PAGE WRAPPER -->
需要httpclient的包,我这里使用的是httpclient4.3.3.jar和httpmime4.3。
如果使用的是maven则在pom.xml中添加:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.3</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.3</version>
</dependency>
路由中upload方法接受form提交的file文件,并且上传到服务器:
IndexController.java代码如下:
package com.test.web.controller;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.ParseException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
* IndexController
@Controller
public class IndexController {
private static final String FAR_SERVICE_DIR = "http://192.168.30.39:8080/receive";// 远程服务器接受文件的路由
private static final long yourMaxRequestSize = 10000000;
@RequestMapping("/")
public String index(Model model) throws IOException {
return "/index";
@RequestMapping("/upload")
public String upload(HttpServletRequest request) throws Exception {
// 判断enctype属性是否为multipart/form-data
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (!isMultipart)
throw new IllegalArgumentException(
"上传内容不是有效的multipart/form-data类型.");
// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置上传内容的大小限制(单位:字节)
upload.setSizeMax(yourMaxRequestSize);
// Parse the request
List<?> items = upload.parseRequest(request);
Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (item.isFormField()) {
// 如果是普通表单字段
String name = item.getFieldName();
String value = item.getString();
// ...
} else {
// 如果是文件字段
String fieldName = item.getFieldName();
String fileName = item.getName();
String contentType = item.getContentType();
boolean isInMemory = item.isInMemory();
long sizeInBytes = item.getSize();
// ...
// 上传到远程服务器
HashMap<String, FileItem> files = new HashMap<String, FileItem>();
files.put(fileName, item);
uploadToFarServiceByHttpClient(files);
return "redirect:/";
private void uploadToFarServiceByHttpClient(HashMap<String, FileItem> files) {
HttpClient httpclient = new DefaultHttpClient();
try {
HttpPost httppost = new HttpPost(FAR_SERVICE_DIR);
MultipartEntity reqEntity = new MultipartEntity();
Iterator iter = files.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
String key = (String) entry.getKey();
FileItem val = (FileItem) entry.getValue();
FileBody filebdody = new FileBody(inputstreamtofile(
val.getInputStream(), key));
reqEntity.addPart(key, filebdody);
httppost.setEntity(reqEntity);
HttpResponse response = httpclient.execute(httppost);
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == HttpStatus.SC_OK) {
System.out.println("服务器正常响应.....");
HttpEntity resEntity = response.getEntity();
System.out.println(EntityUtils.toString(resEntity,"UTF-8"));// httpclient自带的工具类读取返回数据
EntityUtils.consume(resEntity);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
httpclient.getConnectionManager().shutdown();
} catch (Exception ignore) {
public File inputstreamtofile(InputStream ins, String filename)
throws IOException {
File file = new File(filename);
OutputStream os = new FileOutputStream(file);
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
os.close();
ins.close();
return file;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
* IndexController
@Controller
public class FileController {
//private static final String STORE_FILE_DIR="/usr/local/image/";//文件保存的路径
private static final String STORE_FILE_DIR="D:\\";//文件保存的路径
@RequestMapping("/receive")
public String receive(HttpServletRequest request,HttpServletResponse response) throws Exception {
// 判断enctype属性是否为multipart/form-data
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (!isMultipart)
throw new IllegalArgumentException(
"上传内容不是有效的multipart/form-data类型.");
// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Parse the request
List<?> items = upload.parseRequest(request);
Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (item.isFormField()) {
// 如果是普通表单字段
String name = item.getFieldName();
String value = item.getString();
// ...
} else {
// 如果是文件字段
String fieldName = item.getFieldName();
String fileName = item.getName();
String contentType = item.getContentType();
boolean isInMemory = item.isInMemory();
long sizeInBytes = item.getSize();
String filePath=STORE_FILE_DIR+fileName;
//写入文件到当前服务器磁盘
File uploadedFile = new File(filePath);
// File uploadedFile = new File("D:\haha.txt");
item.write(uploadedFile);
response.setCharacterEncoding("UTF-8");
response.getWriter().println("上传成功");
return null;
我们需要把服务端发布到 远程服务器上 使用tomcat等运行起来。
如果项目中有shiro拦截的话记得设置成 /receive = anon 。让接收文件的路由不被拦截。
然后运行客户端,选择文件就可以上传了。对安全有要求的,可以在客户端加一个key,服务器端接收到请求后验证key,没问题的话 再写入目录和文件。
我们已经在上一篇文章中讲解了把文件上传到远程服务器的一种方式:java上传文件到远程服务器(一)---HttpURLConnection方式本章来尝试使用HttpClient方式上传文件到远程服务器:我们在之前的文章中已经在SpringMVC基础框架的基础上应用了BootStrap的后台框架,在此基础上记录HttpURLConnection上传文件到远程服务器。应用bootstrap模板基础项目源
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.10</version>
</dependency>
<dependency>
调用http接口并实现图片传递的关键分为两部分
其一:创建servlet接口,加图片上传注解,用于接收传过来的图片等信息,并做进一步的处理后,返回json格式的结果
其二:创建htpclient,并且运用MultipartEntity对图片进行封装,调用http接口,获取返回值,进行下一步处理
下面就以人脸识别登录,来讲解带有图片的http接口的调用过程
1、创建jsp页面,用于获取...
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
<dependency&
使用freemarker生成的静态文件,统一存储在某个服务器上。本来一开始打算使用ftp实现的,奈何老连接不上,改用jsch。毕竟有现成的就很舒服,在此介绍给大家。
引入的pom
<dependency>
<groupId>ch.ethz.ganymed</groupId>
<artifactId>ganymed-ssh2</artifactId>
<version>262</version>
工作中有时会遇到各种需求,你得变着法儿去解决,当然重要的是在什么场景中去完成。
比如Strut2中file类型如何转换成
multipartfile类型,找了几天,发现一个变通的方法记录如下(虽然最后没有用上。。):
1 private static
MultipartFile getMulFileByPath(String picPath) {
在实际的开发中,我们会遇到上传本地的文件到远程的服务器,今天遇到这个问题做个简单的分享。 主要主要分享常见的三种方式。
1. Spring 的RestTemplate 。
2. java使用HttpURLConnection上传文件到远程服务器 (分为客户端和服务端,客户端负责上传,服务端负责接收文件)
3. java使用HttpClient通过Post...
Closeable
HttpClient httpClient =
HttpClients.createDefault();
HttpPost httpPost = new
HttpPost(url);
MultipartEntityBuilder builder =
MultipartEntityBuilder.create();
builder.addBinaryBody("file", file, ContentType.DEFAULT_BINARY, file.getName());
HttpEntity entity = builder.build();
httpPost.set
Entity(
entity);
Closeable
HttpResponse response =
httpClient.execute(
httpPost);
其中,file为要上传的文件对象,url为上传接口的URL地址。在执行
HttpPost请求时,会将文件作为请求参数发送到
服务器端。
CSDN-Ada助手:
kubernetes---CentOS7安装kubernetes1.11.2图文完整版
wst021sh:
云存储云计算选择开源还是商业版
luj_1768:
java中实现全局变量的功能
农批是真的司马:
linux积累(一)---查看压缩文件的最后一行
Miqiuha: