前后端分離 java后臺(tái)多圖上傳,圖片壓縮,給圖片重命名,返回圖片url

我以前寫的廢話實(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)目的根目錄

image.png

技術(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上傳多圖,顯示多圖
盡搞些這花里胡哨的東西 ??

image.png

請(qǐng)注意

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


image.png

實(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é)了一下還是去給你們打了注解


image.png

這一坨細(xì)講


image.png

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


image.png

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


image.png

取數(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)求頭!!!這是我踩過的坑


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容