前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用HttpClient通过Post请求发送MultipartFile文件

使用HttpClient通过Post请求发送MultipartFile文件

作者头像
Li_XiaoJin
发布2022-06-10 21:11:53
7.3K6
发布2022-06-10 21:11:53
举报
文章被收录于专栏:Lixj's BlogLixj's Blog

最近正好遇到这个需求,在我们网站上传的图片、视频等需要通过接口上传到crm那边,记录一下,以后再遇到可以当作一个工具类使用。

需要引用的依赖: httpclient-4.5.3.jar,httpmime-4.3.jar

代码语言:javascript
复制
    <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.3</version>
        </dependency>

代码如下:

代码语言:javascript
复制
    public String uploadFile(String url, MultipartFile multipartFile) {

        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpPost post = new HttpPost(url);

        MultipartEntityBuilder builder = MultipartEntityBuilder.create();

        String responseStr;
        try {

            logger.info("this file ContentType:" + multipartFile.getContentType());
            //builder.addBinaryBody("file", multipartFile.getInputStream(), ContentType.MULTIPART_FORM_DATA, multipartFile.getOriginalFilename());
        builder.addBinaryBody("file", multipartFile.getInputStream(), ContentType.create(multipartFile.getContentType()), multipartFile.getOriginalFilename());

            builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
            // builder.setMode(HttpMultipartMode.RFC6532);
            builder.setCharset(Charset.forName("UTF-8"));


            HttpEntity multipart = builder.build();
            post.setEntity(multipart);
            CloseableHttpResponse response = httpClient.execute(post);
            HttpEntity responseEntity = response.getEntity();
            responseStr= EntityUtils.toString(responseEntity, "UTF-8");
            logger.info("requestUrl is {}, response is {}", url, responseStr);

        } catch (Exception e) {
            return null;
        }
        return responseStr;
    }

2021-6-10 更新 今天发现可以这么弄,发送的时候设置 ContentType,不然像之前一直发送的都是 MULTIPART_FORM_DATA 类型, 通过 ContentType.create(multipartFile.getContentType()) 可以获取到文件本身的 ContentType,我今天看源码才发现的。。。。 所以说看源码是多么多么的重要啊!!! ———.———

具体修改的代码如下:(上面也更新了~)

代码语言:javascript
复制
builder.addBinaryBody("file", multipartFile.getInputStream(), ContentType.create(multipartFile.getContentType()), multipartFile.getOriginalFilename());

2021-6-24 更新 真是坎坷曲折啊,又发现一个上传文件的坑。 今天发现上传中文名称的文件时,返回的文件名会乱码。

https://blog.csdn.net/youshounianhua123/article/details/81100778HttpClient上传文件时,会调用doWriteTo方法,写一个输出流,但是在调用formatMultipartHeader方法时,底层主要有3种不同的实现,3种方式的采用的字符集不一样。

解决方案是:

代码语言:javascript
复制
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

或者

代码语言:javascript
复制
builder.setMode(HttpMultipartMode.RFC6532);

以上代码已经更新。

没想到一个工具类隐藏的坑也这么多。。。。。。

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可 Links: https://lixj.fun/archives/使用httpclient通过post请求发送multipartfile文件

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-03-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档