一、maven
<!-- 引入json處理包 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.35</version> </dependency> <!--IO 文件流需要的包--> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency>
二、application.yml
server: port: 8080 spring: servlet: multipart: {max-request-size: 100MB, max-file-size: 100MB } # max-request-size上傳文件總的最大值, multipart.max-file-size單個文件的最大值 file: staticAccessPath: /static/upload/img/** # 靜態資源對外暴露的訪問路徑 uploadFolder: F:/upload/ #文件上傳目錄(注意Linux和Windows上的目錄結構不同)
三、java代碼
1). 實現WebMvcConfigurer接口(主要做靜態資源目錄映射)
import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /* * 設置虛擬路徑,訪問絕對路徑下資源 */ @Configuration public class UploadFilePathConfig implements WebMvcConfigurer { @Value("${file.staticAccessPath}") private String staticAccessPath; @Value("${file.uploadFolder}") private String uploadFolder; @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler(staticAccessPath).addResourceLocations("file:" + uploadFolder); } }
2).RandomUtils生成隨機數的類
public class RandomUtils { private static final String charlist = "0123456789"; public static String createRandomString(int len) { String str = new String(); for (int i = 0; i < len; i++) { str += charlist.charAt(getRandom(charlist.length())); } return str; } public static int getRandom(int mod) { if (mod < 1) { return 0; } int ret = getInt() % mod; return ret; } private static int getInt() { int ret = Math.abs(Long.valueOf(getRandomNumString()).intValue()); return ret; } private static String getRandomNumString() { double d = Math.random(); String dStr = String.valueOf(d).replaceAll("[^\\d]", ""); if (dStr.length() > 1) { dStr = dStr.substring(0, dStr.length() - 1); } return dStr; } }
3.MyCommon上傳文件的工具類
import org.apache.commons.io.FilenameUtils; import org.apache.tomcat.util.http.fileupload.IOUtils; import org.springframework.lang.NonNull; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.util.HashMap; import java.util.Map; public class MyCommon { private static Map<String, File> dirMap = new HashMap<>(); /** * 上傳圖片 * @param file 文件流對象 * @param realpath 文件存放路徑 * @return */ public static String inputUploadFile(MultipartFile file, String realpath) { String filename = file.getOriginalFilename();//文件名createFileName(file.getOriginalFilename());// File dir = getDir(realpath); String extname = FilenameUtils.getExtension(filename);//文件擴展名 String allowImgFormat = "gif,jpg,jpeg,png"; if (!allowImgFormat.contains(extname.toLowerCase())) { return "NOT_IMAGE"; } filename = Math.abs(file.getOriginalFilename().hashCode()) + RandomUtils.createRandomString(4) + "." + extname; InputStream input = null; FileOutputStream fos = null; try { input = file.getInputStream(); fos = new FileOutputStream(realpath + "/" + filename); IOUtils.copy(input, fos); } catch (Exception e) { e.printStackTrace(); return null; } finally { IOUtils.closeQuietly(input); IOUtils.closeQuietly(fos); } return filename; } private static String createFileName(String filename) {//重新改變文件名 //FilenameUtils.getExtension(filename);//文件擴展名 String dataReadom = String.valueOf(Math.floor(System.currentTimeMillis() / 1000)); dataReadom += RandomUtils.createRandomString(6); return dataReadom + FilenameUtils.getExtension(filename); } /** * 判斷目錄是否存在不存在則創建目錄 * @param dirName * @return */ private static File getDir(@NonNull String dirName) { File dir = dirMap.get(dirName); if (dir != null) { return dir; } dir = new File(dirName); if (!dir.exists()) { dir.mkdirs(); } dirMap.put(dirName, dir); return dir; } /** * 獲取網站域名地址 * @param request * @return */ public static String domain(HttpServletRequest request) { String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort();// + path; return basePath; } }
四、編寫一個測試上傳文件helloworld(HelloTest類)
import com.alibaba.fastjson.JSONObject; import com.example.hello2.clacc.MyCommon; import org.springframework.beans.factory.annotation.Value; import org.springframework.util.ResourceUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import java.io.FileNotFoundException; @RestController @RequestMapping(path = "/", produces = "application/json;charset=UTF-8") public class HelloTest { @Value("${file.uploadFolder}") private String uploadFolder; private String staticAccessPath = "/static/upload/img/"; private JSONObject result; @RequestMapping(path = "/fileload") public String Upload(MultipartFile file, HttpServletRequest request) throws FileNotFoundException { String domain = MyCommon.domain(request); String basePath = ResourceUtils.getURL("classpath:").getPath(); String fileStr = MyCommon.inputUploadFile(file, uploadFolder); result = new JSONObject(); if (fileStr.equals("NOT_IMAGE")) { result.put("msg", "上傳失敗"); result.put("data", fileStr); result.put("status", 301); } else { result.put("msg", "上傳成功"); result.put("data", domain + staticAccessPath + fileStr); result.put("status", 200); } return result.toJSONString(); } }
五、測試圖
1).postman測試
2).本地目錄
3).瀏覽器訪問
附一、 上傳多圖其實也是這樣只是接收參數改成集合的方式接收
1). 控制器
/**上傳多張圖片**/ @PostMapping(path = "/uploadimgs") public String uploadImgs(@RequestParam("file") List<MultipartFile> files, HttpServletRequest request) throws FileNotFoundException { dataJson = new JSONObject(); String basePath = ResourceUtils.getURL("classpath:").getPath(); List<String> filesStr = MyCommon.inputUploadFiles(files, saveImgPath); dataJson = new JSONObject(); if (filesStr.size() < 1) { dataJson.put("msg", "上傳失敗"); dataJson.put("data", filesStr); dataJson.put("status", 301); } else { dataJson.put("msg", "上傳成功"); dataJson.put("data", filesStr); dataJson.put("status", 200); } return dataJson.toJSONString(); }
2.在MyCommon類中添加一個inputUploadFiles方法
public static List<String> inputUploadFiles(List<MultipartFile> files, String realpath) { List<String> listFile = new ArrayList<>(); for (MultipartFile file : files) { String fileStr = MyCommon.inputUploadFile(file, realpath); if(!fileStr.equals("NOT_IMAGE")){ listFile.add(fileStr); } } return listFile; }
inputUploadFiles