HttpClient实现文件上传功能

以下是关于HttpClient实现文件上传功能的完整攻略。

简介

HttpClient是Apache的一个开源组件,它提供了高效的、简单的、简洁的编程接口,用于发送HTTP/HTTPS请求并处理响应。支持字符集转换、错误处理、重试处理、SSL连接、连接池等。

文件上传是HTTP协议中常用的一个功能,在web开发中尤为常见。HttpClient提供了完整的封装,以方便开发人员实现和管理文件上传。

实现

  1. 添加HttpClient依赖
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.13</version>
</dependency>
  1. 实现文件上传

以下是一个简单的文件上传示例:

import java.io.File;
import java.io.IOException;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

public class FileUploader {

    public static void main(String[] args) throws IOException {
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost("http://localhost:8080/upload");
        //设置文件
        File file = new File("test.txt");
        HttpEntity entity = MultipartEntityBuilder
            .create()
            .addBinaryBody("file", file, ContentType.DEFAULT_BINARY, file.getName())
            .build();
        httpPost.setEntity(entity);
        CloseableHttpResponse response = httpClient.execute(httpPost);
        response.close();
        httpClient.close();
    }
}

以上示例中,通过创建CloseableHttpClient对象并使用HttpPost对象发起POST请求。使用MultipartEntityBuilder构建multipart/form-data类型的请求内容。其中包含一个名为"file"的文件参数,参数值为一个File对象。需要通过ContentType.DEFAULT_BINARY指定参数值类型,并设置文件名为file.getName()。

示例1:Spring MVC上传文件

以Spring MVC为例,实现文件上传的过程如下:

  1. 添加依赖

添加Spring MVC和Apache Commons FileUpload依赖即可。

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.3</version>
</dependency>

<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>
  1. 配置文件上传解析器

在Spring MVC配置文件中添加如下配置:

<bean id="multipartResolver"
      class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="10485760"/> <!--设置最大上传大小为10M-->
    <property name="defaultEncoding" value="UTF-8"/> <!--设置默认编码-->
</bean>
  1. 实现Controller
import java.io.File;
import java.io.IOException;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

@Controller
public class FileUploadController {

    @RequestMapping(value = "/upload", method = RequestMethod.POST)
    public String handleFileUpload(MultipartHttpServletRequest request, Model model) throws IOException {
        List<MultipartFile> files = request.getFiles("file");
        for (MultipartFile file : files) {
            File dest = new File("/path/to/destination/" + file.getOriginalFilename());
            FileUtils.copyInputStreamToFile(file.getInputStream(), dest);
        }
        model.addAttribute("result", "success");
        return "uploadResultPage";
    }
}

以上示例中,在Controller接收请求中使用了MultipartHttpServletRequest和MultipartFile,MultipartFile中即为文件上传的内容。将其保存到对应路径即可。

示例2:使用HttpClient模拟POST上传请求

以下是一个使用HttpClient模拟POST上传请求的示例:

import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

public class UploadFileTest {

    public static void main(String[] args) throws IOException {
        CloseableHttpClient httpclient = HttpClients.createDefault();
        try {
            HttpPost httppost = new HttpPost("http://localhost:8080/upload");
            File file = new File("D:\\test.docx");
            MultipartEntityBuilder builder = MultipartEntityBuilder.create();
            builder.addBinaryBody("file", file, ContentType.APPLICATION_OCTET_STREAM, file.getName());
            HttpEntity reqEntity = builder.build();
            httppost.setEntity(reqEntity);
            CloseableHttpResponse response = httpclient.execute(httppost);
            try {
                System.out.println(response.getStatusLine());
                HttpEntity resEntity = response.getEntity();
                if (resEntity != null) {
                    System.out.println("Response content length: " + resEntity.getContentLength());
                }
                EntityUtils.consume(resEntity);
            } finally {
                response.close();
            }
        } finally {
            httpclient.close();
        }
    }
}

以上示例中,构造了一个HttpPost请求,其中设置了请求URL和需要上传的文件。使用MultipartEntityBuilder构建multipart/form-data类型的请求内容。其中包含一个名为"file"的文件参数,参数值为一个File对象。需要通过ContentType.APPLICATION_OCTET_STREAM指定参数值类型,并设置文件名为file.getName()。然后将构建好的请求内容设置到HttpPost实例中。

总结

以上是关于使用HttpClient实现文件上传功能的完整攻略。可以看出,通过HttpClient实现文件上传的过程主要是构建multipart/form-data类型的请求内容,并发送到服务器。在实际开发中,可根据具体需求进行配置和调整。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:HttpClient实现文件上传功能 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • Java中excel表数据的批量导入方法

    Java中Excel表数据批量导入方法 1. 认识Excel表格 Excel表格是电子表格程序中的一种文件格式,最常见的扩展名为.xlsx。Excel表格数据可以按照行和列进行组织,并且可以进行计算、图表等操作。 2. 批量导入Excel表格数据的步骤 批量导入Excel表格数据的一般流程包括以下步骤: 读取Excel文件。 对Excel文件进行解析,得到表…

    Java 2023年6月15日
    00
  • struts2与cookie 实现自动登录和验证码验证实现代码

    实现自动登录和验证码验证是网站开发中比较常见的需求。在 Struts2 中,可以通过 Cookie 实现自动登录,在用户下次访问网站时,可以直接读取 Cookie 中的登录信息,将用户登录状态自动恢复。验证码则是为了保证网站的安全性,防止自动化程序暴力攻击登录页面。下面介绍基于 Struts2 框架的自动登录和验证码验证的实现方法。 自动登录实现方法 在用户…

    Java 2023年5月20日
    00
  • java连接MySQL数据库的代码

    关于Java连接MySQL数据库的代码,需要完成以下步骤: 导入MySQL驱动包 加载驱动并获取连接 创建Statement或PreparedStatement对象 执行SQL语句 处理结果 关闭连接 具体步骤及示例代码如下: Step 1. 导入MySQL驱动包 通常情况下,我们需要先从官网中下载对应版本的MySQL驱动包,并导入到Java项目中。 在Ma…

    Java 2023年5月19日
    00
  • asp.net中利用Jquery+Ajax+Json实现无刷新分页的实例代码

    首先我们需要了解一下如何在ASP.NET中使用jQuery和AJAX。在ASP.NET中,我们可以使用JavaScriptSerializer对象将对象序列化为JSON格式,然后将其返回给客户端。 以下是实现无刷新分页的详细流程和实例代码: 第一步:添加必要的JavaScript库 我们需要在网站中添加jQuery和Ajax的库文件。可以手动下载这些库文件并…

    Java 2023年5月19日
    00
  • Java集合总结

    Java集合总结 Java集合是Java中非常重要的一个概念,几乎所有的Java应用都离不开Java集合。Java集合主要是用来进行数据存储和操作的,Java集合框架提供了一系列接口和实现类,可以应对不同的数据结构需求,例如数组、列表、栈、队列、图、树等。 Java集合框架主要分为三个部分: Collection接口:包含了一组基本的集合操作,包括添加、删除…

    Java 2023年5月26日
    00
  • Spring MVC 框架搭建配置方法及详解

    Spring MVC 框架搭建配置方法及详解 Spring MVC是一种基于Java的Web框架,它提供了许多便捷的功能和工具,使得开发者可以更加高效地开发Web应用程序。本文将详细讲解如何在Spring MVC中搭建配置框架,并提供两个示例来说明如何实现这一过程。 步骤一:创建Spring MVC项目 在开始使用Spring MVC搭建配置框架之前,我们需…

    Java 2023年5月17日
    00
  • 一篇带你入门Java垃圾回收器

    一篇带你入门Java垃圾回收器 什么是Java垃圾回收器 Java垃圾回收器(Garbage Collector)是Java虚拟机(JVM)的重要组成部分。它管理内存分配和回收,以确保在应用程序运行期间,不会发生内存泄漏或溢出等问题。 垃圾回收器的工作原理 垃圾回收的核心是判断哪些内存块是“垃圾”,然后将其回收。在JVM中,垃圾回收器通过判断对象是否还被引用…

    Java 2023年5月26日
    00
  • Lombok基本注解之@SneakyThrows的作用

    下面是关于Lombok基本注解之@SneakyThrows的作用的完整攻略。 1. @SneakyThrows简介 在Java中,我们通常使用try-catch语句捕获异常。但是,有时候代码中出现的异常并不是我们想要处理的,而是完全出乎意料的异常情况,这时候需要抛出异常。抛出异常通常要求在方法签名上声明当前方法可能会抛出某种类型的异常,这会使代码变得冗长,甚…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部