首頁 > 軟體

Java實現圖片檔案上傳

2022-06-23 14:02:10

Java實現後臺圖片上傳,將上傳圖片的介面進行分層,便於維護介面。

介面部分(interface)

將介面分為單圖片上傳以及多圖片上傳

public interface FileUploadService {
    //單圖片上傳
    PicUploadResult uplodadImg(MultipartFile uploadFile, HttpServletRequest request);

    //多圖片上傳
    PicUploadResult uploadManyImg(MultipartFile[] uploadFile, HttpServletRequest request);
}

介面實現類(interface impl)

上傳圖片方法類(主要)

上傳多個圖片只是使用了陣列的方式將檔案存到MultipartFile裡面。以防程式碼冗餘,所以將實現方法抽出來

/**
     * 上傳圖片方法類
     * @param multipartFile
     * @param request
     * @return
     */
    private PicUploadResult uploadImgMethod(MultipartFile multipartFile, HttpServletRequest request) {
        PicUploadResult picUploadResult = new PicUploadResult();

        if (multipartFile.isEmpty()) {
            //返回選擇檔案提示
            picUploadResult.setLegal(false);
            return picUploadResult;
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd/");
        String format = sdf.format(new Date());
        //存放上傳檔案的資料夾
        File file = new File(baseFilePath + format);
        logger.info("-----------存放上傳檔案的資料夾【" + file + "】-----------");
        logger.info("-----------輸出資料夾絕對路徑 -- 這裡的絕對路徑是相當於當前專案的路徑而不是「容器」路徑【" + file.getAbsolutePath() + "】-----------");
        if (!file.isDirectory()) {
            //遞迴生成資料夾
            file.mkdirs();
        }
        //獲取原始的名字  original:最初的,起始的  方法是得到原來的檔名在客戶機的檔案系統名稱
        String oldName = multipartFile.getOriginalFilename();
        logger.info("-----------檔案原始的名字【" + oldName + "】-----------");
        String newName = UUID.randomUUID().toString() + oldName.substring(oldName.lastIndexOf("."), oldName.length());
        logger.info("-----------檔案要儲存後的新名字【" + newName + "】-----------");
        try {
            //構建真實的檔案路徑
            File newFile = new File(file.getAbsolutePath() + File.separator + newName);
            //轉存檔案到指定路徑,如果檔名重複的話,將會覆蓋掉之前的檔案,這裡是把檔案上傳到 「絕對路徑」
            multipartFile.transferTo(newFile);
            String filePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + "/picbook/" + UPLOAD_PATH_PREFIX + format + newName;
            logger.info("-----------【" + filePath + "】-----------");
            picUploadResult.setLegal(true);
            picUploadResult.setImgPath(filePath);
            return picUploadResult;
        } catch (Exception e) {
            e.printStackTrace();
        }
        picUploadResult.setLegal(false);
        return picUploadResult;
    }

實現方法介面

單圖片上傳

public PicUploadResult uplodadImg(MultipartFile multipartFile, HttpServletRequest request) {
        return uploadImgMethod(multipartFile, request);
    }

多圖片上傳

public PicUploadResult uploadManyImg(MultipartFile[] uploadFile, HttpServletRequest request) {

        List<String> imgPaths = new ArrayList<>();
        for (MultipartFile multipartFile : uploadFile) {
            PicUploadResult picUploadResult = uploadImgMethod(multipartFile, request);
            if(picUploadResult.isLegal()){
                imgPaths.add(picUploadResult.getImgPath());
            }else{
                return picUploadResult;
            }

        }

        PicUploadResult picUploadResult = new PicUploadResult();
        picUploadResult.setLegal(true);
        picUploadResult.setImgPahts(imgPaths);
        return picUploadResult;
    }

實現方法補充

// 專案上傳至絕對路徑(在yml裡設定你的專案絕對路徑)
    @Value("${file.save-path}")
    private String baseFilePath;
    // 專案根路徑下的目錄  -- SpringBoot static 目錄相當於是根路徑下(SpringBoot 預設)
    private final static String UPLOAD_PATH_PREFIX = "statics/uploadFile/";

控制層

public class FileUploadController {
    // 允許上傳的格式 圖片形式
    private static final String[] IMAGE_TYPE = new String[]{".bmp", ".jpg", ".jpeg", ".png"};

    @Resource
    private FileUploadService fileUploadService;

    @PostMapping("/uploadImg")
    public R uploadImg(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
        boolean isFlag = false;
        for (String type : IMAGE_TYPE) {
            System.out.println(file.getOriginalFilename());
            if (StringUtils.endsWithIgnoreCase(file.getOriginalFilename(), type)) {
                isFlag = true;
                break;
            }
        }

        if (isFlag) {
            PicUploadResult picUploadResult = fileUploadService.uplodadImg(file, request);
            boolean isLegal = picUploadResult.isLegal();

            if (isLegal) {
                Map resMap = new HashMap<>();
                resMap.put("imgPath", picUploadResult.getImgPath());
                return R.ok(resMap);
            } else {
                return R.error("圖片上傳有誤");
            }
        } else {
            return R.error("上傳的圖片格式必須為:bmp,jpg,jpeg,png");
        }

    }

    @PostMapping("/uploadManyImg")
    public R uploadManyImg(@RequestParam("files") MultipartFile[] files, HttpServletRequest request) {
        boolean isFlag = false;
        for (MultipartFile uploadFile : files) {
            for (String type : IMAGE_TYPE) {
                if (StringUtils.endsWithIgnoreCase(uploadFile.getOriginalFilename(), type)) {
                    isFlag = true;
                    break;
                }
            }
        }

        if (isFlag) {
            PicUploadResult picUploadResult = fileUploadService.uploadManyImg(files, request);
            boolean isLegal = picUploadResult.isLegal();

            if (isLegal) {
                Map resMap = new HashMap<>();
                resMap.put("imgPaths", picUploadResult.getImgPahts());
                return R.ok(resMap);
            } else {
                return R.error("圖片上傳有誤");
            }
        } else {
            return R.error("上傳的圖片格式必須為:bmp,jpg,jpeg,png");
        }
    }
}

工具類

根據實際情況新增所需的欄位

public class PicUploadResult
{
    private boolean isLegal;

    private String imgPath;

    private List<String> imgPahts;

}

Postman

(僅用於個人學習編碼記錄,程式碼均參考於百度以及自己改進,如有疑問歡迎大家積極討論)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com