关闭

使用HttpClient发送文件流到服务器端

时间: 2019-01-03阅读: 3043标签: 文件

适用场景: 网络绝对路径的URL文件或图片,不存储到本地,转换成stream,直接使用HTTPClient传送到SpringBoot的服务端,将文件存储下来,并返回一个文件地址。目前分层架构的系统越来越多这种需求,所以记录下来以备不时之需。 


1、调用端 

首先引入httpclient所需包

<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>

调用代码:  

package test.http;

import com.alibaba.fastjson.jsON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
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;
import org.apache.http.util.EntityUtils;

import java.io.*;
import java.net.URL;
import java.nio.charset.Charset;

/**
 * 文件传送
 * 发送文件流到服务器端
 * 服务器端使用SpringBoot的MultipartFile接收
 *
 * 适用场景:
 * 绝对路径的URL文件,不存储到本地,转换成stream,直接使用HTTPClient传送到SpringBoot
 *
 */
public class TestUpload {

    public static void main(String[] args) {
        //文件URL,此处取豆瓣上的一个图片
        String fileUrl ="https://img1.doubanio.com/view/photo/l/public/p2537149328.webp";
        try {
            //提取到文件名
            String fileName = fileUrl.substring(fileUrl.lastIndexOf("/")+1);
            //转换成文件流
            InputStream is = new URL(fileUrl).openStream();

            //接收文件的服务器地址
            String uploadURL = "http://localhost:8003/fileupload";

            //创建HttpClient
            CloseableHttpClient httpClient = HttpClients.createDefault();
            HttpPost httpPost = new HttpPost(uploadURL);
            MultipartEntityBuilder builder = MultipartEntityBuilder.create();
            /*绑定文件参数,传入文件流和contenttype,此处也可以继续添加其他formdata参数*/
            builder.addBinaryBody("file",is, ContentType.MULTIPART_FORM_DATA,fileName);
            HttpEntity entity = builder.build();
            httpPost.setEntity(entity);

            //执行提交
            HttpResponse response = httpClient.execute(httpPost);
            HttpEntity responseEntity = response.getEntity();
            if(responseEntity != null){
                //将响应的内容转换成字符串
                String result = EntityUtils.toString(responseEntity, Charset.forName("UTF-8"));

                //此处根据服务器返回的参数转换,这里返回的是JSON格式
                JSONObject output = JSON.parseobject(result);
                JSONArray body = output.getJSONArray("body");
                String resUrl = body.get(0)+"";

                System.out.println(resUrl);
            }
        }catch (Exception ex){
            ex.printStackTrace();
        }

    }
}


2、服务端

服务端直接使用MultipartFile接收即可

/**
     * 上传文件
     * 
     * @throws BusinessException
     */
    @PostMapping("")
    public String upload(@RequestParam(defaultValue = "", required = false) String prefix,
            @RequestParam("file") MultipartFile... files) throws BusinessException {
        ResultView<List<String>> resultView = new ResultView<>();
        List<String> list = new ArrayList<>();
        for (MultipartFile file : files) {
            if (file.isEmpty()) {
                log.warn("have empty upload file,you need check is right?");
                continue;
            }
            String filepath = storageService.store(file, prefix);
            list.add(fileServerAddress + filepath.replaceAll("\\\\", "/"));
        }

        resultView.setBody(list);
        log.info(JSONObject.toJSONString(resultView));
        return JSONObject.toJSONString(resultView);
    }

具体如何存储如何返回,因人而异,我这里返回的是JSON字符串。

其他:本文参考了博友Vincent-Li的博文,表示感谢:https://www.cnblogs.com/lyxy/p/5629151.html

来自:https://www.cnblogs.com/tobeymarshall/p/10215101.html


站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

链接: http://www.fly63.com/article/detial/1758

上传文件异常问题_413 Request Entity Too Large的解决方法

对于有经验的开发着看见这个错误第一反应就是服务器的上传大小设置的不对那么修改服务器上传大小。对于nginx的配置有三个地方可以设置.解决413的正常途径.分别是 http,server,location 根据实际情况设置具体的大小

前端实现.md文件转换成.html文件

.md文件是markdown的一种标记语言,和html比较起来,更简单快捷,主要体现在:标记符的数量。使用i5ting_toc插件、gitbook来生成

lock文件_我们为什么需要 lock 文件

从 Yarn 横空出世推出 lock 文件以来,已经两年多时间了,npm 也在 5.0 版本加入了类似的功能,lock 文件越来越被开发者们接收和认可。本篇文章想从前端视角探讨一下我们为什么需要 lock 文件,以及它的一些成本与风险,当然其中一些观点对于后端也是适用的

将数组转化为 csv 文件类型的代码

将一个数组转化为逗号为分割符的字符串(CSV)即表格数据。利用了 Array.prototype.map() 和 Array.prototype.join() 两个函数,实现了一个简单的数组转化为 csv 文件类型的代码。

HTTP实现xls导出和上传文件处理

需求:导出节目单[不保存文件到本地],输出不同的文件类型[csv,xls,xlsx],上传[csv,xls,xlsx]导入节目单

分析 gulp 的运作方式

vinyl 是 gulp 所使用的虚拟的文件格式,在它的自述文件是这么说的:“当提到文件时你首先想到的是什么?肯定是路径和内容吧”,它主要记录的信息有:path:文件路径,contents:文件内容

前端工程师也要掌握的几种文件路径知识

之前在做webpack配置时候多次用到路径相关内容,最近在写项目的时候,有一个文件需要上传到阿里云oss的功能,同时本地服务器也需要保留一个文件备份。多次用到了文件路径相关内容以及Node核心API的path模块

js下载文件,判断文件是否返回

下载之前用的window.location.href下载的,但是这个判别不了文件是否返回,小文件倒还好,大的文件长时间没有下载也没有加载条什么的,用户有时会点击下载好几下,大的数据很容易将服务拖垮

php实现rar文件的读取和解压

PHP Rar Archiving 模块 (php_rar) 是一个读取和解压rar文件的模块,但不提供RAR压缩(打包)的功能。首先要到PECL的RAR页面下载DLL. 根据自己的情况选择下载对应版本的DLL.

PHP遍历目录和文件及子目录和文件

正常直接使用opendir方法,就可以读到所有的目录和文件。文件可以直接记录下来,目录则需要再进一步获取里边的文件信息。也就是,如果当前读出来是目录,则需要再次调用函数本身(递归)

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!