关闭

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

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

适用场景: 网络绝对路径的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.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

2.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

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

关闭

如何使用 HTML Imports?

Web 组件从第一次被引入,经历了漫长的过程。其中某个组件可能真的会改变我们编写网站的方式,它就是 HTML Imports 。这种方法允许我们将 HTML 文档导入到其他的 HTML 文档中去

TypeScript声明文件

当使用第三方库时,我们需要引用它的声明文件,才能获得对应的代码补全、接口提示等功能。假如我们想使用第三方库 jQuery,一种常见的方式是在 html 中通过 <script> 标签引入 jQuery

使用FileSave.js将网页内容保存到文件

在写Chrome extension时候,偶尔需要将网页的内容保存到文件。要实现此功能,正常的流程是创建Blob对象存放内容,创建url,创建一个 a 标签,然后将连接与Blob对象关联并放到 a标签的href或者download(H5)属性中

h5移动端实现图片文件上传

PC端上传文件多半用插件,引入flash都没关系,但是移动端要是还用各种冗余的插件估计得被喷死,项目里面需要做图片上传的功能,既然H5已经有相关的接口且兼容性良好,当然优先考虑用H5来实现。

原生JS使用Blob导出csv文件

最近在做关于文件下载的需求:前端调用接口,然后对返回数据进行过滤、格式化,然后按表格内容拼接生成csv文件,让用户下载。数据中存在 ‘,‘ 逗号问题处理:将整个数据用双引号(英文格式)包裹起来,这样会显示成一个单元格。

HTML5中FileReader的使用

HTML5定义了FileReader作为文件API的重要成员用于读取文件,FileReader接口提供了读取文件的方法和包含读取结果的事件模型。 FileReader 的实例拥有 4 个方法,其中 3 个用以读取文件,另一个用来中断读取。

在不使用mv命令的情况下移动文件

有时当你需要移动一个文件时,mv 命令似乎不是最佳选项,那么你会如何做呢?不起眼的 mv 命令是在你见过的每个 POSIX 系统中都能找到的有用工具之一。它的作用是明确定义的,并且做得很好

angular2如何访问js文件

angular2访问js文件:先将要使用的js文件下载下来,放到angular2项目的src/assets/js目录,然后告诉angular去哪里加载该库并对要使用的对象进行声明,就可以直接访问js文件了。

JavaScript使用localStorage缓存Js和css文件

对于WebApp来说,将js css文件缓存到localstorage区可以减少页面在加载时与HTTP请求的交互次数,从而优化页面的加载时间.特别是当移端信号不好高延迟时优化效果还是很显见的

getBasePath 函数

假如我们有这样一个javascript文件,它叫dom.js,不过随着版本的不同,它可能叫dom.1.0.js, dom.1.2.js,或者dom-1.2.js。我们要求在这个文件内写一些代码,获得它的路径,然后跟据它动态加载这个路径下的其他JS文件

点击更多...

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