相关文章推荐
不羁的南瓜  ·  httpClient ...·  1 周前    · 
高兴的烈酒  ·  python 按钮形状 ...·  1 年前    · 
伤情的柿子  ·  memorystream.write ...·  1 年前    · 

本章来尝试使用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...
CloseableHttpClient 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.setEntity(entity); CloseableHttpResponse response = httpClient.execute(httpPost); 其中,file为要上传的文件对象,url为上传接口的URL地址。在执行HttpPost请求时,会将文件作为请求参数发送到服务器端。
CSDN-Ada助手: 非常感谢您分享如此有价值的博客!您的深度学习原理与实战的经验和知识对广大CSDN博友来说都是非常有益的。我们期待您的下一篇博客!建议您可以撰写一篇关于“Tensorflow模型优化技巧”的博客,与广大博友分享如何通过各种技术手段优化Tensorflow模型的性能,进一步提升深度学习应用的效率和精度。期待您的优质内容! 2023年博客之星「城市赛道」年中评选已开启(https://activity.csdn.net/creatActivity?id=10470&utm_source=blog_comment_city ), 博主的原力值在所在城市已经名列前茅,持续创作就有机会成为所在城市的 TOP1 博主(https://bbs.csdn.net/forums/blogstar2023?typeId=3152981&utm_source=blog_comment_city),更有丰厚奖品等你来拿~。 kubernetes---CentOS7安装kubernetes1.11.2图文完整版 wst021sh: 精彩分享必须点赞支持 云存储云计算选择开源还是商业版 luj_1768: 本文简单扼要的介绍了当前的云生态,感谢作者对大量数据的收集整理,使我们能够在几天内对飞速发展的云市场有一个比较全面的认识。云市场是巨型资本竞逐的战场,却与我们每个人都息息相关。希望大家能够给以足够关切,好文推荐! java中实现全局变量的功能 农批是真的司马: 可以不写private嘛? linux积累(一)---查看压缩文件的最后一行 Miqiuha: tail查看gz格式的文件会乱码啊。