用户头像上传
思路:
将文件保存到指定路径
为原文件名加上时间戳尽量避免文件名冲突
问题:
上传到应用目录,重新部署项目需要将上传的文件目录拷贝出来。
文件上传Controller
@RequestMapping("/uploadAccountImage") public Result uploadAccountImage(@RequestParam("userImage")MultipartFile userImage, HttpServletRequest request){ try{ log.info("[账户管理][账户头像上传]"); String uploadPath = "upload/account/image"; Map<String, String> uploadResult = fileService.upload( FileUtil.appendBeforeDot(userImage.getOriginalFilename(),"_", GetTimeUtil.getNowTimeStamp()), userImage, FileUtil.appendTimePath(uploadPath, FileUtil.TimeUnit.YEAR), request); log.info("[账户管理][账户头像上传]上传结果:uploadResult={}", JSONObject.toJSONString(uploadResult)); String flag = uploadResult.get("flag"); if("success".equals(flag)){ return ResultFactory.buildSuccessResult(uploadResult); }else{ return ResultFactory.buildFailResult(uploadResult.get("message")); } } catch (CardException e){ return ResultFactory.buidResult(e.getCode(), e.getCardMessage(), null); } catch (Exception e){ e.printStackTrace(); log.error("[账户管理][账户头像上传]发生异常"); return ResultFactory.buildFailResult("发生异常"); } }
{ "code": 200, "message": "成功", "data": { "flag": "success", "webUrl": "upload/account/image/201911/中国图画_20191107163422723.png", "message": "文件上传成功" } }
文件工具类
package com.yuantiao.smartcardms.util; import org.apache.commons.lang3.RandomStringUtils; import java.text.SimpleDateFormat; import java.util.Date; /** * @date: 2019/11/7 14:51 */ public class FileUtil { /** * 为文件名称添加指定字符串。 * @param srcFileName * @param add * @return */ public static String appendBeforeDot(String srcFileName, String... add){ StringBuilder temp = new StringBuilder(); for (int i = 0; i < add.length; i++) { temp.append(add[i]); } String tempAddStr = temp.toString(); StringBuilder sb = new StringBuilder(srcFileName); int i = sb.lastIndexOf("."); if(i == -1){ sb.append(tempAddStr); }else{ sb.insert(i, tempAddStr); } return sb.toString(); } /** * web路径追加路径 * @param webPath * @param addPath * @return */ public static String appendWebPath(String webPath, String... addPath){ StringBuilder result = new StringBuilder(trimSlash(webPath)); for (int i = 0; i < addPath.length; i++) { result.append("/").append(trimSlash(addPath[i])); } return result.toString(); } public static String trimSlash(String str){ if(str.startsWith("/")) str = str.substring(1); if(str.endsWith("/")) str = str.substring(0, str.length() - 1); return str; } /** * web路径追加时间 * @param webPath * @param timeUnit * @return */ public static String appendTimePath(String webPath, TimeUnit timeUnit){ if(!webPath.endsWith("/")) webPath = webPath + "/"; SimpleDateFormat format = new SimpleDateFormat(timeUnit.getFormat()); String timePath = format.format(new Date()); String result = webPath + timePath; return result; } public enum TimeUnit{ YEAR("yyyy"), MONTH("yyyyMM"), DAY("yyyyMMdd"); private String format; TimeUnit(String format){ this.format = format; } public String getFormat(){ return format; } } public static void main(String[] args) { String srcName = "图片.png"; String result = appendBeforeDot(srcName, "_" + GetTimeUtil.getNowTimeStamp(), "_", RandomStringUtils.randomNumeric(4)); System.out.println(result); String pathYear = "user"; System.out.println(appendTimePath(pathYear, TimeUnit.YEAR)); System.out.println(appendTimePath(pathYear, TimeUnit.MONTH)); System.out.println(appendTimePath(pathYear, TimeUnit.DAY)); String path = "/baidu/"; System.out.println(trimSlash(path)); System.out.println(appendWebPath(path, "/1ewe/", "chongyang/")); //https://img2018.cnblogs.com/blog/1478368/201911/1478368-20191103192011017-752436299.png } }
日期工具类
package com.yuantiao.smartcardms.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; /** * 时间工具类 */ public class GetTimeUtil { //时间戳 public static final String timeStamp="yyyyMMddHHmmssSSS"; public static final String time_Stamp="yyyy-MM-dd HH:mm:ss.SSS"; public static final String date_time="yyyy-MM-dd HH:mm:ss"; /** * 获取当前时间戳--毫秒 * @return */ public static String getNowTimeStamp() { SimpleDateFormat sdf = new SimpleDateFormat(timeStamp); return sdf.format(new Date()); } /** * DateFormatter Date to String. * * @param format * 日期定义格式 * @param date * Date类型日期 * @return String类型日期 */ public static String format(String format, Date date) { try { if (date == null || "".equals(date)) { return null; } SimpleDateFormat sdf = new SimpleDateFormat(format); return sdf.format(date); }catch(Exception e){ e.printStackTrace(); } return null; } /** * 获取两个时间中的每一天 * @param bigtimeStr 开始时间 yyyy-MM-dd * @param endTimeStr 结束时间 yyyy-MM-dd * @return * @throws ParseException */ public static List<String> getDays(String bigtimeStr, String endTimeStr) throws ParseException { Date bigtime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(bigtimeStr + " 00:00:00"); Date endtime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(endTimeStr + " 00:00:00"); //定义一个接受时间的集合 List<Date> lDate = new ArrayList<>(); lDate.add(bigtime); Calendar calBegin = Calendar.getInstance(); // 使用给定的 Date 设置此 Calendar 的时间 calBegin.setTime(bigtime); Calendar calEnd = Calendar.getInstance(); // 使用给定的 Date 设置此 Calendar 的时间 calEnd.setTime(endtime); // 测试此日期是否在指定日期之后 while (endtime.after(calBegin.getTime())) { // 根据日历的规则,为给定的日历字段添加或减去指定的时间量 calBegin.add(Calendar.DAY_OF_MONTH, 1); lDate.add(calBegin.getTime()); } List<String> datas = new LinkedList<>(); for (Date date : lDate) { datas.add(new SimpleDateFormat("yyyy-MM-dd").format(date)); } return datas; } public static void main(String[] args) { String nowTimeStamp = GetTimeUtil.getNowTimeStamp(); System.out.println(nowTimeStamp); } }
文件上传服务类
package com.yuantiao.smartcardms.service; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; /** * @date: 2019/11/7 14:55 */ @Service public class FileService { public Map<String, String> upload(MultipartFile file, String webPath, HttpServletRequest request){ return upload(file.getOriginalFilename(), file, webPath, request); } public Map<String, String> upload(String fileName, MultipartFile file,String webPath, HttpServletRequest request){ //处理后缀 if(!webPath.endsWith("/")) webPath += "/"; String webUrl = webPath + fileName; HashMap<String, String> result = new HashMap<>(); //获取物理路径 String fileRealPath = request.getServletContext().getRealPath(webUrl); File destFile = new File(fileRealPath); //目录不存在 if(!destFile.getParentFile().exists()){ destFile.getParentFile().mkdirs(); } //目录存在是文件 if(destFile.getParentFile().isFile()){ result.put("flag", "fail"); result.put("message","父级路径是文件而不是目录"); return result; } //文件已经存在 if(destFile.exists()){ result.put("flag", "fail"); result.put("message","文件已经存在"); return result; } try { file.transferTo(destFile); result.put("flag", "success"); result.put("message","文件上传成功"); result.put("webUrl",webUrl); } catch (IOException e) { e.printStackTrace(); result.put("flag", "fail"); result.put("message","文件写入本地发生异常"); } return result; } }
服务器地址
server: servlet: context-path: /mozq
String contextPath = request.getContextPath(); // /mozq String realPath1 = request.getServletContext().getRealPath(null); // null String realPath2 = request.getServletContext().getRealPath(""); //C:\Users\1\AppData\Local\Temp\tomcat-docbase.1683852606771175828.80\ String realPath3 = request.getServletContext().getRealPath("/upload"); // C:\Users\1\AppData\Local\Temp\tomcat-docbase.3156895875552019719.80\upload String realPath4 = request.getServletContext().getRealPath("download"); // C:\Users\1\AppData\Local\Temp\tomcat-docbase.3156895875552019719.80\download
文件系统路径分隔符
System.out.println(File.separator);
bugs
Caused by: java.io.FileNotFoundException: C:\Users\1\AppData\Local\Temp\tomcat-docbase.1363371158874723329.80\upload\user\Capture001changzhou.png (系统找不到指定的路径。)
Can't load log handler "java.util.logging.FileHandler" java.nio.file.NoSuchFileException: log\spring.log.0.lck java.nio.file.NoSuchFileException: log\spring.log.0.lck 原因: spring日志打印不出来,然后端口号被占用,直接启动失败没有任何提示信息。
Caused by: java.lang.IllegalArgumentException: ContextPath must start with '/' and not end with '/' 正确代码: server: servlet: context-path: /mozq
来源:https://www.cnblogs.com/mozq/p/11813386.html