文件上传采用虚拟路径实现项目部署和用户资源分离

实现用户资源和项目分离使用到了下面这个工具类:

保存路径工具类
package cn.gukeer.common.utils;

import com.github.pagehelper.StringUtil;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.util.Properties;
import java.util.StringTokenizer;

/**
 * 文件管理帮助类,处理应用之外的文件,如照片、邮件附件等不依赖于应用存在而存在的文件。 注意:里面的文件路径除了特殊说明外都是基于VFS根路径的
 *
 * @author guowei
 */
public abstract class VFSUtil {
    private static Log log = LogFactory.getLog(VFSUtil.class);

    /**
     * VFS 根路径(最后没有/号)
     */
    private static String VFS_ROOT_PATH;

    static {
        try {
            readVFSRootPath();// 给VFS_ROOT_PATH赋初始值
        } catch (Exception e) {
            log.error("读取配置文件出错!", e);
        }

    }

    /**
     * 读取VFS路径配置文件
     */
    private static void readVFSRootPath() {
        String key = null;
        if (System.getProperty("os.name").toUpperCase().indexOf("WINDOWS") != -1) {
            key = "vfsroot.windows";
        } else {
            key = "vfsroot.linux";
        }
        try {
            Properties p = new Properties();
            InputStream inStream = new ClassPathResource("/db.properties").getInputStream();
            p.load(inStream);
            VFS_ROOT_PATH = p.getProperty(key);
        } catch (Exception e1) {
            VFS_ROOT_PATH = "";
            log.error("[vfsroot路径读取]配置文件模式出错!", e1);
        }

        if (StringUtil.isEmpty(VFS_ROOT_PATH)) {
            if (System.getProperty("os.name").toUpperCase().indexOf("WINDOWS") != -1) {
                VFS_ROOT_PATH = "C:/gukeer/vfsroot/";
            } else {
                VFS_ROOT_PATH = "/opt/gukeer/vfsroot/";
            }
        }
    }

    /**
     * 获取当前的VfsRootPath
     *
     * @return
     */
    public static String getVFSRootPath() {
        return VFS_ROOT_PATH;
    }

    /**
     * 获取文件输入流
     *
     * @param file
     * @param fileStream
     * @return
     */
    public static InputStream getInputStream(File file, boolean fileStream) {
        if (fileStream == true) {//使用文件流
            FileInputStream fin = null;
            try {
                fin = new FileInputStream(file);

            } catch (FileNotFoundException e) {
                if (log.isDebugEnabled()) {
                    log.debug(e);
                }
                String msg = "找不到指定的文件[" + file.getName() + "]。";
                if (log.isDebugEnabled()) {
                    log.debug(msg);
                }
                throw new FileOperationException(msg, e);
            }
            return fin;
        } else { // 使用内存流
            InputStream in = null;
            if (file != null && file.canRead() && file.isFile()) {
                try {
                    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
                    FileInputStream stream = new FileInputStream(file);
                    BufferedInputStream bin = new BufferedInputStream(stream);
                    int len = 0;
                    byte[] b = new byte[1024];
                    while ((len = bin.read(b)) != -1) {
                        buffer.write(b, 0, len);
                    }

                    stream.close();
                    in = new ByteArrayInputStream(buffer.toByteArray());
                } catch (Exception e) {
                    String msg = "不能读取文件[" + file.getName() + "]";
                    if (log.isErrorEnabled()) {
                        log.error(msg, e);
                    }
                    throw new FileOperationException(msg, e);
                }
            } else {
                String msg = "不是文件或文件不可读[" + file.getName() + "]";
                if (log.isDebugEnabled()) {
                    log.debug(msg);
                }
                throw new FileOperationException("不是文件或文件不可读");
            }
            return in;
        }
    }
}
注意事项:

  ①在resources文件夹内配置properties文件,包含vfsroot路径信息(windows和linux两个路径),修改上传方法使用户上传的文件和其他资源均存储在vfsroot路径下,并将图片存储路径保存在数据库内方便客户端读取使用;

  properties配置demo:

  

#db config
jdbc.schema=gk_platform
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&useSSL=false
jdbc.username=root
jdbc.password=123456
vfsroot.windows=C:/platform/vfsroot/
vfsroot.linux=/opt/platform/vfsroot/

  ②由于客户端不能直接请求访问位于服务器物理路径上的资源,因此前端页面采用流读取的方式显示图片和其他资源;在controller内添加如下方法:

  

  /**
     * 读取图片文件
     *
     * @param response
     * @throws Exception
    */
    @RequestMapping("/website/showPicture")
    public void showPicture(HttpServletResponse response, String picPath) throws Exception {
        File file = new File(VFS_ROOT_PATH + picPath);
        if (!file.exists()) {
            logger.error("找不到文件[" + VFS_ROOT_PATH + picPath + "]");
            return;
        }
        response.setContentType("multipart/form-data");
        InputStream reader = null;
        try {

            reader = VFSUtil.getInputStream(file, true);
            byte[] buf = new byte[1024];
            int len = 0;

            OutputStream out = response.getOutputStream();

            while ((len = reader.read(buf)) != -1) {
                out.write(buf, 0, len);
            }
            out.flush();
        } catch (Exception ex) {
            logger.error("显示图片时发生错误:" + ex.getMessage(), ex);
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (Exception ex) {
                    logger.error("关闭文件流出错", ex);
                }
            }
        }
    }

前台jsp页面调用:<img src="<%=contextPath%>${image.imagesUrl}">,例如:

<img src=‘test/website/showPicture?picPath=/images/upload/image/20160608/1465355183063.png‘/>

数据库保存图片的URL为/website/showPicture?picPath=/images/upload/image/20160608/1465355183063.png

时间: 2024-10-18 23:24:21

文件上传采用虚拟路径实现项目部署和用户资源分离的相关文章

【PHP原生】动态多文件上传并将路径存储在数据库

动态多文件上传并将路径存储在数据库 1.上传页面index.html <!DOCTYPE html > <html> <head> <metahttp-equiv="Content-Type"content="text/html; charset=utf-8"/> <title>多图片上传</title> <script> //全局变量,代表文件域的个数,并用该变量区分文件域的nam

Web下文件上传下载的路径问题

工程结构 1.生成一个文件到指定文件夹下 //产生一个唯一的名字 this.setFileName(String.valueOf(System.currentTimeMillis())); String path = ServletActionContext.getServletContext().getRealPath("/template/WordExportTemplate"); //工程下的完整路径名 String filepath = path +"\\"

增删查改实现多文件上传, 采用ASP.NET MVC 5 and EF 6

public class Support { public int SupportId { get; set; } [Required(ErrorMessage="please enter your Name")] [Display(Name="Name")] [MaxLength(100)] public string Name { get; set; } [Required(ErrorMessage="plese enter summary"

Jfinal文件上传基础路径问题,windows下会以项目根路径为基础路径

在本地windows下开发测试文件上传 使用com.jfinal.cos进行multipart/form-data请求数据格式的文件上传解析 import com.jfinal.upload.UploadFile; ... List<UploadFile> upFile = this.getFiles(savePath); 我设置的savePath="D:/home/upload" 预想的情况会默认将文件上传到该路径下 java.lang.RuntimeException:

Eclipse搭建springboot项目(三)文件上传

知识点:SpringBoot2.x文件上传:HTML页面文件上传和后端处理 1.springboot文件上传 MultipartFile file,源自SpringMVC 1)静态页面直接访问:localhost:8080/index.html 注意点:如果想要直接访问html页面,则需要把html放在springboot默认加载的文件夹下面 2)MultipartFile 对象的transferTo方法,用于文件保存(效率和操作比原先用FileOutStream方便和高效) 访问路径 http

SpringMVC文件上传下载

在Spring MVC的基础框架搭建起来后,我们测试了spring mvc中的返回值类型,如果你还没有搭建好springmvc的架构请参考博文->http://www.cnblogs.com/qixiaoyizhan/p/5819392.html 今天我们来讲讲spring mvc中的文件上传和下载的几种方法. 首先附上文件目录->我们需要配置的我做了记号-> 一.文件上传 首先为了方便后续的操作,以及精简代码,我们在Utils包下封装一个文件上传下载的帮助类: Files_Helper

Vbs脚本将本地文件上传到Azure存储账户

说到Azure相信大家都已经非常熟悉了,所以就不做多介绍了,我们都知道在Azure上有一个存储账户,在存储账户下可以可以创建容器,可以存放数据,近期公司呢为了达到数据的安全性,准备将本地的备份数据给Azure存储账户下备份一份: Azure提供了很多方法可以将本地的文件上传到Azure存储账户下,比如Powershell.Azcopy.存储文件管理工具,但是存储工具和powershell不支持断点续传,只有Azcopy支持断点续传,所以我们就用Azcopy进行数据的传输,在此说一下Azcopy也

Struts2之struts2文件上传详解

一.学习案例:通过在uploadfile.jsp页面填写完表单,提交后跳转到success.jsp页面,然后验证upload包下上传文件是否成功. 二.案例分析:struts2文件上传并不是表面上看的只需简单配置就可以上传文件.实际是分为两步的.1.struts2首先将客户端上传的文件保存到struts.multipart.saveDir键所指定的目录,如果该键所对应的目录不存在,就会保存到javax.servlet.context.tempdir环境变量所指定的目录中.2.Action中所定义

Java文件上传细讲

什么是文件上传? 文件上传就是把用户的信息保存起来. 为什么需要文件上传? 在用户注册的时候,可能需要用户提交照片.那么这张照片就应该要进行保存. 上传组件(工具) 为什么我们要使用上传工具? 为啥我们需要上传组件呢?当我们要获取客户端的数据,我们一般是通过getParameter()方法来获取的. 上传文件数据是经过MIME协议进行分割的,表单进行了二进制封装.也就是说:getParameter()无法获取得到上传文件的数据. 我们首先来看看文件上传http是怎么把数据带过去的 jsp页面,表