springboot2.0 maven上传文件到远端服务器

承接之前的博文”springboot maven+layui上传文件“,文件上传到远端服务器,并返回用于存储数据库需要的文件服务器存储路径和文件大小。

pom.xml 依赖

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.4</version>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.8.1</version>
</dependency>

这里把请求远端服务器上传文件的方法作为一个工具类,降低代码的重复性,减少内存资源的消耗,增加代码的拓展性

  • uploadUrl 服务器上传接口地址
  • LinkedMultiValueMap 一个键对应多个值(添加一个Key对应多个Value:void add(K, List))
    public String serverUpload(String tempFilePath) {
        JSONObject jsonObject = null;
        // 设置请求头
        HttpHeaders headers = new HttpHeaders();
        MediaType type = MediaType.parseMediaType("multipart/form-data");
        headers.setContentType(type);
        // 设置请求体,注意是LinkedMultiValueMap
        FileSystemResource resource = new FileSystemResource(tempFilePath);
        MultiValueMap<String, Object> form = new LinkedMultiValueMap<>();
        form.add("files", resource);
        HttpEntity<MultiValueMap<String, Object>> files = new HttpEntity<>(form, headers);
        // 跨域请求服务器,返回jsonObject
        ResponseEntity<JSONObject> responseEntity = restTemplate.postForEntity(uploadUrl, files, JSONObject.class);
        jsonObject = responseEntity.getBody();
        // 获得文件在服务器的 url
        List<String> List = new ArrayList<>();// 文件链接列表
        String data = "";
        if ((Integer) jsonObject.get("statusCode") == 200) {
    //      List = (List<String>) jsonObject.get("data");
    //      src = List.get(0);
            data = jsonObject.get("data").toString();
        }
        return data.substring(1, data.length() - 1);
    //  return src;
    }

文件格式化工具,获得文件大小

    public String formateFileSize(int size) {
        double s = size + 0.0;
        String fileSize = null;
        if (size >= 1048576) {
            fileSize = formateDouble(s / 1048576.0) + "M";
        } else if (size < 1024) {
            fileSize = formateDouble(s) + "B";
        } else {
            fileSize = formateDouble(s / 1024.0) + "K";
        }
        return fileSize;
    }

    public String formateDouble(double value){
        DecimalFormat df = new DecimalFormat("#.00");
        return df.format(value);
    }

简单编写一个 controller 测试一下上传一张图片,并返回图片的远程路由。

  • System.getProperty("java.io.tmpdir") 获取系统临时目录,Java输入输出临时路径
  • file.transferTo(tempFile) 写入文件到临时路径,能写入再调用服务器接口上传
    @RequestMapping(value = "/uploadFile", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
    public String uploadGroupFile(HttpServletRequest request, @RequestParam("file") MultipartFile file) {
        //判断是否允许普通成员上传文件
        int size = (int) file.getSize();
        //50MB
        if (size > 52428800L) {
            return jsonResult.error(201, "上传文件过大,最大为50MB");
        }
        // 获取文件名
        String originalFilename = file.getOriginalFilename();
        if (StringUtils.isBlank(originalFilename)) {
            return "文件名不能为空";
        }
        // 创建临时文件
        String tempFilePath = System.getProperty("java.io.tmpdir") + originalFilename;
        File tempFile = new File(tempFilePath);
        try {
            file.transferTo(tempFile);//上传文件
        } catch (IOException e) {
            e.printStackTrace();
            return "文件上传失败!!!";
        }
        //没有出错则调用文件上传接口
        String url = fileUtil.serverUpload(tempFilePath);
        if (tempFile.exists()) {
            tempFile.delete();// 删除临时文件
        }    
        // 格式化文件大小
        String fileSize = myFileUtil.formateFileSize(size);
        
        // 数据库操作...
        
        return url;
    }

运行项目用 postman 简单测试一下接口,结果如下:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值