• spring-boot上传图片并访问


    源码下载

    一、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
  • 相关阅读:
    重复的listen port引发的问题
    Win10开始运行不保存历史记录原因和解决方法
    意识到const版本函数的重要性
    人物访谈1
    人物访谈2
    读《浪潮之巅》有感
    测试作业
    读《活出生命的意义》有感
    价值观作业
    关于C语言的问卷调查
  • 原文地址:https://www.cnblogs.com/zhizou/p/11069498.html
Copyright © 2020-2023  润新知