基于SpringBoot项目做一个文件上传和下载

  • Post author:
  • Post category:其他


一、基本功能


文件上传,也成为uploadFile,是指将本地图片、视频、音频等文件上传到服务器上,可以让其它用户浏览和下载文件。在实际项目开发中文件上传是常用的。由于本项目是自己写接口做的就没有具体的前端代码。


二、代码实现的过程

1. 公共配置类common

package com.demo.kuberclient.common;


/**
 * 设置状态码
 */
public class Constast {

    //响应返回码
    public static final String CODE_OK="200";
    public static final String MSG_OK="OK";

    //文件上传到服务器的地址
    public static final String UPLOAD_PATH="D:/桌面/DCServer/src/main/resources/static/images/";


}

2.工具类Util

package com.demo.kuberclient.utils;

import cn.hutool.core.io.FileUtil;
import com.alibaba.fastjson.JSONObject;
import com.decoclouds.kuberclient.common.Constast;
import io.swagger.annotations.Api;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.List;
@Api(tags = "logo图标上传工具类")
public class LogoUntil {
    /**
     * 根据时间戳生成唯一id
     */
    public static String getCurrentTimeTimestamp(){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSSS");
        return sdf.format(System.currentTimeMillis());
    }

    // 文件上传返回的 JSON 字符串格式
    public static String getFileJSONString(List<String> url,List<String> list) {
        JSONObject json = new JSONObject();
        json.put("code", Constast.CODE_OK);
        json.put("msg", Constast.MSG_OK);
        json.put("url", url);
        json.put("filename",list);
        return json.toJSONString();
    }


    /**
     * 文件下载查看
     * @param path
     * @return
     */
    public static ResponseEntity<Object> createResponseEntity(String path) {
        System.out.println(path);
        //1,构造文件对象
        File file=new File(Constast.UPLOAD_PATH, path);
        System.out.println(file.toString());
        System.out.println(file.exists());
        if(file.exists()) {
            //将下载的文件,封装byte[]
            byte[] bytes=null;
            try {
                bytes = FileUtil.readBytes(file);
            } catch (Exception e) {
                e.printStackTrace();
            }
            //创建封装响应头信息的对象
            HttpHeaders header=new HttpHeaders();
            //封装响应内容类型(APPLICATION_OCTET_STREAM 响应的内容不限定)
            header.setContentType(MediaType.APPLICATION_JSON);
            //创建ResponseEntity对象
            ResponseEntity<Object> entity= new ResponseEntity<Object>(bytes, header, HttpStatus.CREATED);
            System.out.println(entity);
            return entity;
        }
        return null;
    }
}

我是根据时间戳生成的文件名字具体自己实现,也可用UUID

3.Controller

package com.demo.kuberclient.controller;
import com.decoclouds.kuberclient.common.Constast;
import com.decoclouds.kuberclient.utils.LogoUntil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("/logoUpload")
@Api(tags = "logo图片上传")
public class FileController {


    /**
     * 文件上传
     * @param file
     * @return
     */
    @ApiOperation(value = "上传文件", notes = "接受String类型参数")
    @PostMapping("/uploadFile")
    @ResponseBody
    public String uploadMdPic(MultipartFile[] file, HttpServletRequest request) {
        String url = null; // 图片访问地址
        String fileFolderName = LogoUntil.getCurrentTimeTimestamp();
        System.out.println("获取前端踹过来的文件数据"+file);
        List<String> list = new ArrayList<>();
        List<String> list1 = new ArrayList<>();
        if (file.length > 0) {
            //循环多次上传多个文件
            for (MultipartFile files : file) {
                if (!files.isEmpty()) {
                    try {
                        // 获取上传文件的名称
                        String  trueFileName = files.getOriginalFilename();
                        list.add(trueFileName);
                        System.out.println("获取文件名称"+trueFileName);
                        // 图片存储路径
                        File  dest = new File(Constast.UPLOAD_PATH + fileFolderName + '/' + trueFileName);
                        System.out.println("获取文件路径"+dest);
                        // 图片访问地址
                        if (trueFileName.contains(".json")) {
                            url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() +
                                    "/dcserver/logoUpload/readFileByPath/" + fileFolderName + "/" + trueFileName;
                            list1.add(url);
                        }else{
                            url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() +
                                    "/dcserver/logoUpload/readFileByPath/" + fileFolderName + "/" + trueFileName;
                            list1.add(url);
                        }
                        if (!dest.getParentFile().exists()) {
                            dest.getParentFile().mkdirs();
                        }
                        if (dest.exists()) {
                            continue;
                        }
                        files.transferTo(dest);
                    } catch (Exception e) {
                        e.printStackTrace();
                        continue;
                    }
                    continue;
                }
            }
        }
        String Url = LogoUntil.getFileJSONString(list1,list);
        return Url;
    }

    /**
     * 图片下载并读取
     */
    @RequestMapping("/readFileByPath/{fileFolderName}/{fileName}")
    public ResponseEntity<Object> showImageByPath(@PathVariable(value = "fileFolderName") String fileFolder, @PathVariable(value = "fileName") String fileName){
        StringBuilder path = new StringBuilder();
        path.append(fileFolder);
        path.append("/");
        path.append(fileName);
        return LogoUntil.createResponseEntity(path.toString());
    }


}

因为前端需要回显,我就顺便做个了回显,回显为Json类型的,可以通用,具体返回什么,可自行调整。因为就是自己写接口自己测,我用的Apipost测试的,前端我就不上传代码了,可以自行测试,效果就只能在接口中看到。

这是在做的过程中,觉得这一块感觉还可以记录下,如果有更好的方法可以和我一起探讨哦!



版权声明:本文为weixin_56445565原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。