SpringBoot实现多文件上传+http请求转发(流的方式)

前言

需求:用户端访服务器A,拿到请求数据后,将数据传送到B服务器上去进行业务的实现;请求数据包含普通参数和文件数组。

正文

服务器A:(接受参数并进行数据传递)

前置准备代码:

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

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

<dependency>
    <groupId>commons-httpclient</groupId>
    <artifactId>commons-httpclient</artifactId>
    <version>3.1</version>
</dependency>

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.73</version>
</dependency>
public class Param {
    private Integer recordId;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date recordTime;
    private String content;
    private MultipartFile[] file;
    private List<Long> userIds;
}

主代码:

@PostMapping("/aTest")
public JSONObject aTest(Param param) throws Exception {
    if (null == param.getContent()){ //参数校验
        throw new ServiceException("内容不能为空"); //业务异常
    }
    CloseableHttpClient httpClient = HttpClients.createDefault();
    HttpPost httpPost = new HttpPost("服务器B的地址" + "/addComment");

    httpPost.addHeader("AUTHORIZATION", request.getHeader(AUTHORIZATION)); //请求头
    MultipartEntityBuilder builder = MultipartEntityBuilder.create();
    builder.setCharset(Charset.forName("utf-8"));
    builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);//加上此行代码解决返回中文乱码问题

    if(param.getFile()!=null){ //文件
        MultipartFile[] files = param.getFile();
        for (int i=0;i<files.length;i++){
        MultipartFile file = files[i];
        builder.addBinaryBody(file.getOriginalFilename(),file.getInputStream(),ContentType.MULTIPART_FORM_DATA,file.getOriginalFilename()); // 文件流
        }
    }

    //普通参数都要变为字符类型进行传送
    builder.addTextBody("recordId", param.getRecordId().toString()); //原为Integer类型
    builder.addTextBody("recordTime",String.valueOf(param.getRecordTime().getTime())); //原为Date类型
    builder.addTextBody("content", param.getContent()); //原为String类型
    builder.addTextBody("userIds", StringUtils.join(param.getUserIds(), ",")); //原为List<Long>类型

    HttpEntity entity = builder.build();
    httpPost.setEntity(entity);
    HttpResponse response = httpClient.execute(httpPost); //执行提交

    return JSONObject.parseObject(EntityUtils.toString(response.getEntity())); //转换类型并返回
}

服务器B:(拿到参数并进行业务处理)

前置准备代码:

public class testParam {
    private String recordId;
    private String recordTime;
    private String content;
    private StandardMultipartHttpServletRequest[] files;
    private String userIds;
}
public class AddCommentParam {
    private Integer recordId;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date recordTime;
    private String content;
    private MultipartFile[] file;
    private List<Long> userIds;
}
public class Response<T> {
    private String code; //响应码
    private String msg; //响应信息
    private T body; //业务内容
}

主代码:

@PostMapping("/addComment")
public Response<Boolean> addComment(testParam param, HttpServletRequest request) throws IOException,ParseException {
    SimpleDateFormat format =  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    AddCommentParam param1 = new AddCommentParam();

    //文件
    MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
    Iterator<String> iter = multipartRequest.getFileNames();
    List<MultipartFile> file = new ArrayList<>();
    while (iter.hasNext()) {
        MultipartFile multipartFile = multipartRequest.getFile(iter.next());
        file.add(multipartFile);
    }
    if(file.size()>0){
        param1.setFile(file.toArray(new MultipartFile[file.size()]));
    }

    //普通参数
    param1.setContent(param.getContent());
    param1.setRecordId(Integer.valueOf(param.getRecordId()));
    param1.setRecordTime(format.parse(format.format(Long.valueOf(param.getRecordTime()))));
    param1.setUserIds(Arrays.stream(StringUtils.split(param.getUserIds())).map(a ->         Long.parseLong(a)).collect(Collectors.toList()));

    //todo:业务代码的实现;
    return new Response<>(200,"操作成功",null);
}

总结

小白一枚,欢迎各位大佬指导!!!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值