zoukankan      html  css  js  c++  java
  • HttpClient中转上传文件

    场景:客户端(浏览器)A---->选择文件上传---->服务器B---->中转文件---->服务器C---->返回结果---->服务器B---->客户端A

    有时候在项目中需要把上传的文件中转到第三方服务器,第三方服务器提供一个接收文件的接口。

    而我们又不想把文件先上传到服务器保存后再通过File来读取文件上传到第三方服务器,我们可以使用HttpClient来实现。

    因为项目使用的是Spring+Mybatis框架,文件的上传采用的是MultipartFile,而FileBody只支持File。

    所以这里采用MultipartEntityBuilder的addBinaryBody方法以数据流的形式上传。

    这里需要引入两个jar包:httpclient-4.4.jar和httpmime-4.4.jar

    Maven pom.xml引入

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

    上传代码:

        /**
         * 中转文件
         * 
         * @param file
         *            上传的文件
         * @return 响应结果
         */
        public String httpClientUploadFile(MultipartFile file) {
            final String remote_url = "http://192.168.1.99:8080/demo/file/upload";// 第三方服务器请求地址
            CloseableHttpClient httpClient = HttpClients.createDefault();
            String result = "";
            try {
                String fileName = file.getOriginalFilename();
                HttpPost httpPost = new HttpPost(remote_url);
                MultipartEntityBuilder builder = MultipartEntityBuilder.create();
                builder.addBinaryBody("file", file.getInputStream(), ContentType.MULTIPART_FORM_DATA, fileName);// 文件流
                builder.addTextBody("filename", fileName);// 类似浏览器表单提交,对应input的name和value
                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;
        }
  • 相关阅读:
    03-链表
    23-自定义用户模型
    01-使用pipenv管理项目环境
    10-多线程、多进程和线程池编程
    17-Python执行JS代码--PyExecJS、PyV8、Js2Py
    09-Python-Socket编程
    08-迭代器和生成器
    07-元类编程
    06-对象引用、可变性和垃圾回收
    05-深入python的set和dict
  • 原文地址:https://www.cnblogs.com/lyxy/p/5629151.html
Copyright © 2011-2022 走看看