zoukankan      html  css  js  c++  java
  • JAVA项目实战-文件的上传和下载功能

    本章分享大家项目经验,实现图片或文件的上传和下载,相信大家对于文件保存位置,

    以及不同系统分隔符号不同,也会导致文件保存下载失败,今天将帮助大家解决此疑惑。

    package com.sf.vsolution.hb.sfce.util.upload;
    
    import org.springframework.util.ClassUtils;
    import org.springframework.web.multipart.MultipartFile;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.*;
    import java.net.URLEncoder;
    import java.util.Random;
    
    /**
     * @description:
     * @author: zhucj
     * @date: 2019-08-07 9:34
     */
    public class FileUploadUtil {
        /**
         * 上传图片至项目中,保存位置 resources下(量少可以用,数量大不太建议使用)
         * @param request
         * @param file 文件内容
         * @return 文件名字
         */
        public static String saveFile(HttpServletRequest request,
                                     MultipartFile file) {
            // 判断文件是否为空
            if (!file.isEmpty()) {
                try {
                    //保存服务器,注意在Linux系统和Windows系统,文件分隔符不通用
                    String path = ClassUtils.getDefaultClassLoader().getResource("").getPath();
                    //此处自动根据系统,选择不同分隔符 /static/upload/fileName
                    String filePath = path + "static" + File.separator + "upload" + File.separator+file.getOriginalFilename();
                    File saveDir = new File(filePath);
                    if (!saveDir.getParentFile().exists()){
                        saveDir.getParentFile().mkdirs();
                    }
                    // 转存文件
                    file.transferTo(saveDir);
                    return file.getOriginalFilename();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return null;
        }
    
    
    
        /**
         * 上传文件到本地服务器磁盘
         * @param fileName 上传文件路径名称
         * E:/upload/img/12013212.jpg 
         * @param file
         * @return
         */
        public static String uploadFile(String fileName, MultipartFile file){
            //项目中保存在本地服务时  fileName  = 磁盘路径(注意区分系统) + 文件名称
            File  serverFile= new File(fileName);
            try {
                //判断文件是否已经存在
                if (serverFile.exists()) {
                    throw new RuntimeException("文件已经存在");
                }
                //判断文件父目录是否存在
                if (!serverFile.getParentFile().exists()) {
                    serverFile.getParentFile().mkdir();
                }
                //将上传的文件写入到服务器端文件内
                file.transferTo(serverFile);
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
            return fileName;
        }
    
    
        /**
         * 文件下载
         * @param path 服务器文件地址
         * @param response
         * @return
         */
        public static int downloadFile(String path, HttpServletResponse response) {
    
            int result = 1;
            InputStream is = null;
            OutputStream os = null;
            try {
                File file = new File(path);
                // 清空response
                response.reset();
                // 设置response的Header
                response.setCharacterEncoding("utf-8");
                response.setContentType("multipart/form-data");
                response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(file.getName(), "utf-8"));
                OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
                is = new FileInputStream(file);
                os = response.getOutputStream();
                byte[] b = new byte[2048];
                int length;
                while ((length = is.read(b)) > 0) {
                    os.write(b, 0, length);
                }
                toClient.flush();
                toClient.close();
            } catch (IOException ex) {
                ex.printStackTrace();
                result = 0;
            } finally {
                closeInputStream(is);
                closeOutputStream(os);
            }
    
            return result;
        }
    
        private static void closeInputStream(InputStream is) {
            try {
                if (is != null) {
                    is.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        private static void closeOutputStream(OutputStream os) {
            try {
                if (os != null) {
                    os.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 生成随机文件名
         */
        public static String genImageName() {
            //取当前时间的长整形值包含毫秒
            long millis = System.currentTimeMillis();
            //加上三位随机数
            Random random = new Random();
            int end3 = random.nextInt(999);
            //如果不足三位前面补0
            String str = millis + String.format("%03d", end3);
    
            return str;
        }
    
    
    
    }

     项目中,我们如何访问上传到服务器磁盘上的图片了?一般本地只需要本地图片路径+图片名称即可在浏览器中访问。经常配置项目路径映射实现

      

    package com.sf.vsolution.hb.sfce.config.interceptor;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.CorsRegistry;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    
    /**
     * @description: 拦截器设置
     * @author: zhucj
     * @date: 2019-07-18 14:44
     */
    
    @Configuration
    public class WebAppConfig implements WebMvcConfigurer {
    
    
        @Value("${upload.upload-path}")
        private String uploadPath;
    
      /**
         * 配置图片虚拟路径
         * @param registry
         */
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/upload/**").addResourceLocations("file:" + uploadPath);
        }
    
    }

    注:配置完成后,所有localhost:8080/upload/1571292610115393.jpg  请求接口全部转成  file:E:/upload/img/1571292610115393.jpg .拦截器中配置的uploadPath地址,注意不同系统问题

  • 相关阅读:
    Java中的String为什么是不可变的? -- String源码分析
    理解值和对象-快照图
    线程Thread
    Spring Cloud中,如何解决Feign/Ribbon第一次请求失败的问题?
    不要做一个浮躁的程序员
    关于在springboot中利用@Value注解读取配置文件中的属性值得问题
    Intellij Idea expired
    javascript事件之:谈谈自定义事件
    javascript事件之: 事件冒泡, 事件捕获 ,阻止默认事件
    windows7自带远程连接工具连接不上远程,只有windows服务器版本能连接tsmmc能连接的问题
  • 原文地址:https://www.cnblogs.com/zhucj-java/p/12016666.html
Copyright © 2011-2022 走看看