Java實(shí)現(xiàn)圖片文件上傳
Java實(shí)現(xiàn)后臺(tái)圖片上傳,將上傳圖片的接口進(jìn)行分層,便于維護(hù)接口。
接口部分(interface)
將接口分為單圖片上傳以及多圖片上傳
public interface FileUploadService {
?? ?//單圖片上傳
? ? PicUploadResult uplodadImg(MultipartFile uploadFile, HttpServletRequest request);
?? ?//多圖片上傳
? ? PicUploadResult uploadManyImg(MultipartFile[] uploadFile, HttpServletRequest request);
}接口實(shí)現(xiàn)類(interface impl)
上傳圖片方法類(主要)
上傳多個(gè)圖片只是使用了數(shù)組的方式將文件存到MultipartFile里面。以防代碼冗余,所以將實(shí)現(xiàn)方法抽出來
/**
? ? ?* 上傳圖片方法類
? ? ?* @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("-----------輸出文件夾絕對(duì)路徑 -- 這里的絕對(duì)路徑是相當(dāng)于當(dāng)前項(xiàng)目的路徑而不是“容器”路徑【" + file.getAbsolutePath() + "】-----------");
? ? ? ? if (!file.isDirectory()) {
? ? ? ? ? ? //遞歸生成文件夾
? ? ? ? ? ? file.mkdirs();
? ? ? ? }
? ? ? ? //獲取原始的名字 ?original:最初的,起始的 ?方法是得到原來的文件名在客戶機(jī)的文件系統(tǒng)名稱
? ? ? ? String oldName = multipartFile.getOriginalFilename();
? ? ? ? logger.info("-----------文件原始的名字【" + oldName + "】-----------");
? ? ? ? String newName = UUID.randomUUID().toString() + oldName.substring(oldName.lastIndexOf("."), oldName.length());
? ? ? ? logger.info("-----------文件要保存后的新名字【" + newName + "】-----------");
? ? ? ? try {
? ? ? ? ? ? //構(gòu)建真實(shí)的文件路徑
? ? ? ? ? ? File newFile = new File(file.getAbsolutePath() + File.separator + newName);
? ? ? ? ? ? //轉(zhuǎn)存文件到指定路徑,如果文件名重復(fù)的話,將會(huì)覆蓋掉之前的文件,這里是把文件上傳到 “絕對(duì)路徑”
? ? ? ? ? ? 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;
? ? }實(shí)現(xiàn)方法接口
單圖片上傳
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;
? ? }實(shí)現(xiàn)方法補(bǔ)充
// 項(xiàng)目上傳至絕對(duì)路徑(在yml里配置你的項(xiàng)目絕對(duì)路徑)
? ? @Value("${file.save-path}")
? ? private String baseFilePath;
? ? // 項(xiàng)目根路徑下的目錄 ?-- SpringBoot static 目錄相當(dāng)于是根路徑下(SpringBoot 默認(rèn))
? ? 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");
? ? ? ? }
? ? }
}工具類
根據(jù)實(shí)際情況添加所需的字段
public class PicUploadResult
{
? ? private boolean isLegal;
? ? private String imgPath;
? ? private List<String> imgPahts;
}Postman



(僅用于個(gè)人學(xué)習(xí)編碼記錄,代碼均參考于百度以及自己改進(jìn),如有疑問歡迎大家積極討論)
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
在剛開始學(xué)習(xí)Java的時(shí)候,就了解了Java基礎(chǔ)中的變量,雖然知道這個(gè)以后會(huì)經(jīng)常用到,但沒想到了基本語法這里,竟然又冒出來了成員變量和局部變量。變來變?nèi)ヌ菀鬃屓烁銜灹耍裉煳覀兙吞魭鰜硎崂硪幌拢?/div> 2016-07-07
關(guān)于log4j日志擴(kuò)展---自定義PatternLayout
這篇文章主要介紹了關(guān)于log4j日志擴(kuò)展---自定義PatternLayout,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Spring Mvc中傳遞參數(shù)方法之url/requestMapping詳解
在開發(fā)中,參數(shù)傳遞是必不可少的一個(gè)功能,下面這篇文章主要給大家介紹了關(guān)于Spring Mvc中傳遞參數(shù)方法之url/requestMapping的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-07-07
@Value如何獲取yml和properties配置參數(shù)
這篇文章主要介紹了@Value如何獲取yml和properties配置參數(shù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Java excel數(shù)據(jù)導(dǎo)入mysql的實(shí)現(xiàn)示例詳解
今天教大家如何使用Java將excel數(shù)據(jù)導(dǎo)入MySQL,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴呢很有幫助,需要的朋友可以參考下2022-08-08
Java編程實(shí)現(xiàn)beta分布的采樣或抽樣實(shí)例代碼
這篇文章主要介紹了Java編程實(shí)現(xiàn)beta分布的采樣或抽樣實(shí)例,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
ShardingSphere jdbc實(shí)現(xiàn)分庫分表核心概念詳解
這篇文章主要為大家介紹了ShardingSphere jdbc實(shí)現(xiàn)分庫分表核心概念詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12最新評(píng)論

