首页 > 其他分享 >SpringBoot发送带文件的Post请求

SpringBoot发送带文件的Post请求

时间:2023-09-24 23:34:51浏览次数:31  
标签:SpringBoot 发送 printStackTrace file catch Post httpClient String

使用httpclient发送一个带文件参数的Post请求

Pom依赖

	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
		<artifactId>httpclient</artifactId>
		<version>4.5.3</version>
	</dependency>
	<dependency>
		<groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpmime</artifactId>
        <version>4.5.8</version>
    </dependency>

服务请求

@PostMapping("/upload")
public String fileForward(MultipartFile file) {

    // 这是一个开源上传图床的API
    // 参数 file : 表单文件
    // 返回值:  [{"src":"/file/5d5dd7108a93f6d1e9249.png"}]
    String url = "https://img.nickyam.com/upload";
    
	// 因为该网站不受信任,下面静态方法是信任所有网站
    // 不信任网站报 “unable to find valid certification path to requested target”
    CloseableHttpClient httpClient = getScontractHttpClient();
    String result = "";
    try {

        String fileName = file.getOriginalFilename();
        // 创建Post请求
        HttpPost httpPost = new HttpPost(url);
        
        // 建造者模式构造参数
        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
        // 类似浏览器表单提交,对应input的name和value
        builder.addBinaryBody("file", file.getInputStream(), 
                              ContentType.MULTIPART_FORM_DATA, fileName);// 文件流
        HttpEntity entity = builder.build();
        
        httpPost.setEntity(entity);
		// 执行提交
        HttpResponse response = httpClient.execute(httpPost);
        // 获取响应内容
        HttpEntity responseEntity = response.getEntity();
        if (responseEntity != null) {
            // 将响应内容转换为字符串
            result = EntityUtils.toString(responseEntity, Charset.forName("UTF-8"));
        }
    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            httpClient.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    return result;
}

// 信任所有的网站
public static CloseableHttpClient getScontractHttpClient() {
    SSLContext sslContext = null;
    try {
        sslContext = SSLContexts.custom().loadTrustMaterial(null, new TrustStrategy() {
            @Override
            public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
                return true;
            }
        }).build();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (KeyManagementException e) {
        e.printStackTrace();
    } catch (KeyStoreException e) {
        e.printStackTrace();
    }
    //创建httpClient
    return HttpClients.custom().setSSLContext(sslContext).
        setSSLHostnameVerifier(new NoopHostnameVerifier()).build();
}

展示

测试结果

标签:SpringBoot,发送,printStackTrace,file,catch,Post,httpClient,String
From: https://www.cnblogs.com/lsj4/p/17726943.html

相关文章

  • PostgreSQL教程:备份与恢复(物理备份、物理恢复)
    物理备份(归档+物理)这里需要基于前面的文件系统的备份和归档备份实现最终的操作单独使用文件系统的方式,不推荐毕竟数据会丢失。这里直接上PostgreSQL提供的pg_basebackup命令来实现。pg_basebackup会做两个事情、会将内存中的脏数据落到磁盘中,然后将数据全部备份会将wal日志直接做归......
  • PostgreSQL教程:事务的ACID特性及基本使用
    什么是ACID?在日常操作中,对于一组相关操作,通常要求要么都成功,要么都失败。在关系型数据库中,称这一组操作为事务。为了保证整体事务的安全性,有ACID这一说:原子性A:事务是一个最小的执行单位,一次事务中的操作要么都成功,要么都失败。一致性C:在事务完成时,所有数据必须保持在一致的状态。(事......
  • PostgreSQL教程:触发器
    触发器Trigger,是由事件触发的一种存储过程当对标进行insert,update,delete,truncate操作时,会触发表的Trigger(看触发器的创建时指定的事件)构建两张表,学生信息表,学生分数表。在删除学生信息的同时,自动删除学生的分数。先构建表信息,填充数据createtablestudent(idint,namev......
  • PostgreSQL教程:约束(主键、非空、唯一、检查约束)
    核心在于构建表时,要指定上一些约束。约束主键--主键约束droptabletest;createtabletest(idbigserialprimarykey,namevarchar(32));非空--非空约束droptabletest;createtabletest(idbigserialprimarykey,namevarchar(32)notnull);......
  • PostgreSQL教程:数组类型
    数组还是要依赖其他类型,比如在设置住址,住址可能有多个住址,可以采用数组类型去修饰字符串。PGSQL中,指定数组的方式就是[],可以指定一维数组,也支持二维甚至更多维数组。构建数组的方式:droptabletest;createtabletest(idserial,col1int[],col2int[2],col3......
  • PostgreSQL教程:JSON&JSONB类型
    JSON在MySQL8.x中也做了支持,但是MySQL支持的不好,因为JSON类型做查询时,基本无法给JSON字段做索引。PGSQL支持JSON类型以及JSONB类型。JSON和JSONB的使用基本没区别。撇去JSON类型,本质上JSON格式就是一个字符串,比如MySQL5.7不支持JSON的情况的下,使用text也可以,但是字符串类型无法校验......
  • PostgreSQL教程:IP类型cidr
    PGSQL支持IP类型的存储,支持IPv4,IPv6这种,甚至Mac内种诡异类型也支持这种IP类型,可以在存储IP时,帮助做校验,其次也可以针对IP做范围查找。IP校验的效果IP也支持范围查找。......
  • PostgreSQL教程:枚举类型
    枚举类型MySQL也支持,只是没怎么用,PGSQL同样支持这种数据类型可以声明枚举类型作为表中的字段类型,这样可以无形的给表字段追加诡异的规范。--声明一个星期的枚举,值自然只有周一~周日。createtypeweekasenum('Mon','Tues','Sun');--声明一张表,表中的某个字段的类型是上面声......
  • PostgreSQL教程:日期类型
    在PGSQL中,核心的时间类型,就三个。timestamp(时间戳,覆盖年月日时分秒)date(年月日)time(时分秒)在PGSQL中,声明时间的方式。只需要使用字符串正常的编写yyyy-MM-ddHH:mm:ss就可以转换为时间类型。直接在字符串位置使用之前讲到的数据类型转换就可以了。当前系统时间:-可以使用now作为......
  • RocketMq发送消息之事务消息
    概述事务消息共有三种状态,提交状态、回滚状态、中间状态:TransactionStatus.CommitTransaction:提交事务,它允许消费者消费此消息。TransactionStatus.RollbackTransaction:回滚事务,它代表该消息将被删除,不允许被消费。TransactionStatus.Unknown:中间状态,它代表需要检查消......