我以前寫的廢話實(shí)在太多了,想刪掉這篇,但是又想留個(gè)紀(jì)念
大家請(qǐng)看精簡版 ??
http://www.itdecent.cn/p/cef984644ff0
這是我嘔心瀝血從GitHub到碼云,各種博客翻爛了,
寫的吐血的勞動(dòng)成果
我現(xiàn)在很膨脹~哈哈哈哈哈哈
今天是個(gè)好日子
用的是這個(gè) MultipartFile 可以了解一下
廢話不多說,現(xiàn)在開始
這篇文章包含多圖上傳,多圖和單圖區(qū)別真真不大,圖片是放在tomcat
項(xiàng)目的根目錄

技術(shù)說因?yàn)轫?xiàng)目是打成war包
這樣后期方便遷移
雖然不懂,但技術(shù)萬歲(≧▽≦)/
第一步
我們先去pom引入依賴嘻嘻嘻
<!--文件上傳-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.0.1</version>
</dependency>
<!--圖片壓縮了解一下-->
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
上controller層 FileUploadController
這個(gè)也沒啥用
反正我沒用到過‘
但是我看到別人都有
那我也必須有 口亨 ?? 可作測試用叭
package com.asset.controller.backend.base;
import com.asset.common.ServerResponse;
import com.asset.service.base.FileService;
import com.asset.util.Transform;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.List;
/**
* 基礎(chǔ)設(shè)置控制
*
* @author Administrator
*/
@RequestMapping("/app")
@Controller
public class FileUploadController {
@Autowired
private FileService fileService;
//圖片上傳 吼吼吼
@RequestMapping("saveImg.do")
@ResponseBody
public ServerResponse saveImg(@RequestParam(value = "file", required = false) MultipartFile[] files,
HttpServletRequest request) {
String path = request.getSession().getServletContext().getRealPath("/upload/image");
System.out.println(path);
List<String> list = fileService.getUploadFile(files, path);
File file = new File(path);
if (!file.exists()) {
file.mkdirs();
}
if (!list.isEmpty()) {
StringBuilder sb = new StringBuilder();
for (String s : list) {
sb.append("upload/image/" + String.valueOf(s) + ",");
}
return ServerResponse.createBySuccess(sb);
}
return ServerResponse.createByErrorMessage("上傳失敗");
}
/**
* 上傳臨時(shí)圖片
*/
@RequestMapping("/settempfile")
@ResponseBody
public ServerResponse settempfile(@RequestParam(value = "photos", required = false) MultipartFile[] file,
HttpServletRequest request) {
String savepath = request.getParameter("savepath");
if (Transform.TestIsEmpty(savepath)) {
savepath = "upload/temp";
}
String path = request.getSession().getServletContext().getRealPath(savepath);
List<String> files = fileService.getUploadFile(file, path);
if (null != file) {
if (!files.isEmpty()) {
savepath = savepath + "/" + files.get(0);
return ServerResponse.createBySuccess(savepath);
}
}
return ServerResponse.createByErrorMessage("上傳失敗");
}
}
server層
package com.asset.service.base;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
/**
* @author xyy
* @date 2019-05-14 16:32
*/
public interface FileService {
List<String> getUploadFile(MultipartFile[] files, String path);
}
impl實(shí)現(xiàn)類
字體大一號(hào),代表這個(gè)是真的有用
這個(gè)里面有對(duì)圖片重命名 和 對(duì)比圖片類型
我把圖片壓縮也擱在這里了
package com.asset.service.base.impl;
import com.asset.service.base.FileService;
import net.coobird.thumbnailator.Thumbnails;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.*;
/**
* @author xyy
* @date 2019-05-14 16:37
*/
@Service("fileService")
public class FileServiceImpl implements FileService {
public static Set<String> photo;
static {
photo = new HashSet<String>();
String[] phototype = {".png", ".jpg", ".jpeg", ".gif", ".bmp"};
for (String string : phototype) {
photo.add(string);
}
}
@Override
public List<String> getUploadFile(MultipartFile[] file, String savepath) {
List<String> files = new LinkedList<String>();
try {
for (MultipartFile multipartFile : file) {
String type = multipartFile.getOriginalFilename();
System.out.println("type" + type);
type = type.substring(type.lastIndexOf("."), type.length());
String fileName = NextInt(10000, 99999) + System.currentTimeMillis() + type;
File targetFile = new File(savepath, fileName);
if (!targetFile.exists()) {
targetFile.mkdirs();
}
// targetFile.delete();
// 保存
try {
multipartFile.transferTo(targetFile);
if (multipartFile.getSize() > 100000) {
String newfilename = NextInt(10000, 99999) + System.currentTimeMillis() + type;
if (photo.contains(type)) {
fileName = newfilename;
}
}
files.add(fileName);
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
}
return files;
}
@Override
public List<String> saveImg(CommonsMultipartFile[] multipartFiles, String path) {
List<String> files = new LinkedList<String>();
for (CommonsMultipartFile commonsMultipartFile : multipartFiles) {
String type = commonsMultipartFile.getOriginalFilename();
if (type != null && type != "") {
type = type.substring(type.lastIndexOf("."), type.length());
String fileName = NextInt(10000, 99999) + System.currentTimeMillis() + type;
File targetFile = new File(path, fileName);
if (photo.contains(type)) {
try {
// 先嘗試壓縮并保存圖片
Thumbnails.of(commonsMultipartFile.getInputStream()).scale(1f).outputQuality(0.25f).toFile(targetFile);
} catch (IOException e) {
try {
// if (!targetFile.exists())
// targetFile.mkdirs();
commonsMultipartFile.transferTo(targetFile);
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
files.add(fileName);
}
}
return files;
}
public static void main(String[] args) {
String[] phototype = {".png", ".jpg", ".jpeg", ".gif", ".bmp"};
}
/**
* 生成隨機(jī)數(shù)
*
* @param min
* @param max
* @return
*/
public static int NextInt(final int min, final int max) {
Random rand = new Random();
int tmp = Math.abs(rand.nextInt());
return tmp % (max - min + 1) + min;
}
}
接下來是跟項(xiàng)目結(jié)合使用
我要做的是一個(gè)app上傳多圖,顯示多圖
盡搞些這花里胡哨的東西 ??

請(qǐng)注意
實(shí)體類這里 因?yàn)閭鬟^來的不是只有圖片 so~

實(shí)現(xiàn)類 不截圖了 怕你們懶得打
@Override
public ServerResponse saveWorkOrder(WorkOrder workOrder, HttpServletRequest request) {
if (workOrder.getFid() != null) {
//path 圖片的保存路徑 就是存到項(xiàng)目的根目錄
String path = (new File(request.getServletContext().getRealPath("/"))).getParent() + "/upload" + request.getContextPath() + "/image";
List<String> list = fileService.getUploadFile(workOrder.getPhoto(), path);
if (!list.isEmpty()) {
//存數(shù)據(jù)庫
StringBuilder sb = new StringBuilder();
for (String s : list) {
sb.append("upload" + request.getContextPath() + "/image/" + String.valueOf(s) + ",");
}
workOrder.setCompleteimg(sb.toString());
}
workOrderMapper.updateByPrimaryKeySelective(workOrder);
} else {
workOrderMapper.insertSelective(workOrder);
}
return ServerResponse.createByErrorMessage("保存成功");
}
糾結(jié)了一下還是去給你們打了注解

這一坨細(xì)講

現(xiàn)在已經(jīng)存進(jìn)數(shù)據(jù)庫 我們要拿粗來

這是我們拿出來的效果 可以直接訪問

取數(shù)據(jù)庫字段拼url
@Override
public ServerResponse getImg(Integer fid, HttpServletResponse response) {
//url 是tomcat項(xiàng)目路徑
String url = MyUtil.getTomcatUrl();
//通過查詢 查存圖片的字段
String img = workOrderMapper.selectImg(fid);
List<String> imgList = new ArrayList<>();
//根據(jù)逗號(hào)分割
if (!Transform.TestIsEmpty(img)) {
String[] imgs = img.split(",");
for (int i = 0; i < imgs.length; i++) {
imgList.add(url + imgs[i]);
}
}
return ServerResponse.createBySuccess(imgList);
}
調(diào)用了工具類 拿到tomcat的url
package com.asset.util;
import com.asset.service.finance.FinPayService;
import com.asset.vo.request.FinPayManageReqVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.mvc.condition.RequestConditionHolder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Created by YQY on 2018/10/31.
*/
public class MyUtil {
//獲取后臺(tái)項(xiàng)目路徑
public static String getUrl(){
HttpServletRequest request=((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
return basePath;
}
//獲取前端路徑
public static String getFrontUrl(){
HttpServletRequest request=((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort();
return basePath;
}
//獲取tomcat項(xiàng)目路徑
public static String getTomcatUrl() {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + "/";
return basePath;
}
}
不想看工具類就看這里叭 就調(diào)用了工具類這個(gè)方法
獲取tomcat項(xiàng)目路徑
//獲取tomcat項(xiàng)目路徑
public static String getTomcatUrl() {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + "/";
return basePath;
}
不想寫了 我累了 突然發(fā)現(xiàn)會(huì)一樣?xùn)|西不代表可以講清一樣?xùn)|西
感jio有點(diǎn)亂 我有時(shí)間在整理叭
對(duì)了,題外話’
用postman測試多圖上傳
不能有請(qǐng)求頭!!!這是我踩過的坑
