SpringBoot跨服务上传文件到另一个服务器

 

 

最近在工作中遇到一个问题,也是解决了半天。决定今天记录一下自己踩过的坑。因为这个项目跟之前做过的不太一样(①前端将文件上传 到 ----->②服务器 ----------->③再将文件上传到另一个服务)
因为多了中间一步感觉就不要太一样了。有什么不一样?直接上代码。

 

 

 

前端代码:


前端使用的是react前端框架。具体用的axios发起的异步请求

//上传文件
  handleSubmit = text => {
    const { fileList } = this.state;
    //使用FormData()对象来提交数据
    const formData = new FormData();
    fileList.forEach(file => {
        //要提交的file文件
      formData.append('file', file);
    });
    //要提交的参数
    formData.append('resource_id', text.resource_id);
    if (
      fileList.length == 1 &&
      'undefind' != typeof formData &&
      formData != null &&
      formData != ''
    ) {
      axios({
        method: 'post',
       url:"对应的api",
        data: formData,
        params: {
          view_mode: 'json',
        },
        headers: {
          'Content-Type': 'application/json;charset=utf-8',
        },
      })
        //得到返回数据
        .then(function(response) {
          if(response.data.success){
            message.success('upload successfully.');
          }else{
            message.error('upload failed.');
          }
        })
        .catch(function(error) {
          console.log(error);
          message.error('服务错误');
        });
    }
  };

 

 


java后端代码:
 

  @RequestMapping(value  =  "/admin/uploadFile",  method  =  RequestMethod.POST)
        @ResponseBody
        public  Object  uploadResource(HttpServletRequest  request)  throws  Exception  {
                MultipartHttpServletRequest  multipartRequest  =  (MultipartHttpServletRequest)  request;
                //相当于获取form表单隐藏域的参数
                String  resourceId  =  request.getParameter("resource_id");
                 //获取form表单要上传的文件
                MultipartFile  file  =  multipartRequest.getFile("file");
                //获取文件的文件名字(后面要用到)
                String  filename  =  file.getOriginalFilename();
                //这个url是要上传到另一个服务器上接口
                String  url  =  String.format("http://服务器地址:端口号/接口的api");
                Object  object  =  null;
                //创建HttpClients实体类
                CloseableHttpClient  aDefault  =  HttpClients.createDefault();
                try  {
                        HttpPost  httpPost  =  new  HttpPost(url);
                        MultipartEntityBuilder  builder  =  MultipartEntityBuilder.create();
                        //这里就是自己踩的坑,需要使用file.getBytes()
                        //builder.addBinaryBody("file",file.getInputStream(),ContentType.create("multipart/form-data"),filename);
                        //使用这个,另一个服务就可以接收到这个file文件了
                        builder.addBinaryBody("file",file.getBytes(),ContentType.create("multipart/form-data"),filename);
                        StringBody  stringBody  =  new  StringBody(resourceId,ContentType.MULTIPART_FORM_DATA);
                        builder.addPart("resource_id",stringBody);
                        HttpEntity  entity  =  builder.build();
                        httpPost.setEntity(entity);

                        ResponseHandler  rh  =  new  ResponseHandler()  {
                                @Override
                                public  Object  handleResponse(HttpResponse  response)  throws  IOException  {
                                        HttpEntity  entity  =  response.getEntity();
                                        String  result  =  EntityUtils.toString(entity,  "UTF-8");
                                        return  result;
                                }
                        };
                        aDefault  =  HttpClients.createDefault();
                        object  =  aDefault.execute(httpPost,  rh);
                }  catch  (Exception  e)  {
                        LogUtil.error(String.format(e.toString()));
                }  finally  {
                        aDefault.close();
                }
                return  object;
        }

 

 

 

博主强烈推荐:https://blog.csdn.net/persistencegoing/article/details/84376427

希望大家关注我一波,防止以后迷路,有需要的可以加群讨论互相学习java ,学习路线探讨,经验分享与java求职  

群号:721 515 304

你可能感兴趣的:(java基础)