springboot 上传图片到服务器磁盘,数据库地址指定外部目录

本文介绍了如何在SpringBoot应用中实现图片上传到服务器磁盘,并将图片路径保存到数据库中,包括yml配置、配置类、相关配置及控制器和工具类的详细步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

springboot 上传图片到服务器磁盘,数据库地址指定外部目录

1、yml文件

jingle:
  systemName: XXXX
  officeName: XXXX
  version: 1.0
  copyrightYear: 2019
  profile: d://jingle/
  staticAccessPath: /profile/**
  staticAccess: /profile
  fileExt: .png|.jpg|.jpeg|.gif|.bmp|.rar|.zip|.doc|.docx|.xls|.xlsx|.ppt|.pptx|.pdf|.txt

2 、配置类

/**
 * 通用配置
 * 
 
 */
@Configuration
public class ResourcesConfig extends WebMvcConfigurerAdapter
{

	
	 @Value("${jingle.staticAccessPath}")
	    private String staticAccessPath;
	
    /**
     * 首页地址
     */
    @Value("${shiro.user.indexUrl}")
    private String indexUrl;

    /**
     * 默认首页的设置,当输入域名是可以自动跳转到默认指定的网页
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry)
    {
        registry.addViewController("/").setViewName("forward:" + indexUrl);
        registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
        super.addViewControllers(registry);
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry)
    {
        registry.addResourceHandler(staticAccessPath).addResourceLocations("file:" + JingleConfig.getProfile());
    }
}

3、config

/**
 * 读取项目相关配置
 * 
 * @author jingle
 */
@Component
@ConfigurationProperties(prefix = "jingle")
public class JingleConfig
{
    /** 机构名称 */
    private String officeName;
	
    /** 项目名称 */
    private String systemName;
    /** 版本 */
    private String version;
    /** 版权年份 */
    private String copyrightYear;

    public static String userId = "70120008";
    
    public static String  webserviceUrl;
    
    public static String privateKey;
    
    private Integer queryNum;
    /** 上传路径 */
    private static String profile;
    
    private static String staticAccessPath;
    
    private static String staticAccess;
    
    public static String exportExcelPath="d:/export/excel/";
    
    public static String  fileExt=".png|.jpg|.jpeg|.gif|.bmp|.rar|.zip|.doc|.docx|.xls|.xlsx|.ppt|.pptx|.pdf|.txt";

    
    private static String hngpUrl;
    private static Integer hngpUsername;
    private static String hngpPassword;
    private static String serviceUrl;
    private static String bankName;
    private static String bankNo;
    private static String appId;
    private static String merchantPrivateKey;
    private static String alipayPublicKey;
    
    public static String getAppId() {
		return appId;
	}

	public static void setAppId(String appId) {
		JingleConfig.appId = appId;
	}

	public static String getMerchantPrivateKey() {
		return merchantPrivateKey;
	}

	public static void setMerchantPrivateKey(String merchantPrivateKey) {
		JingleConfig.merchantPrivateKey = merchantPrivateKey;
	}

	public static String getAlipayPublicKey() {
		return alipayPublicKey;
	}

	public static void setAlipayPublicKey(String alipayPublicKey) {
		JingleConfig.alipayPublicKey = alipayPublicKey;
	}

	public static String getBankName() {
		return bankName;
	}

	public static void setBankName(String bankName) {
		JingleConfig.bankName = bankName;
	}

	public static String getBankNo() {
		return bankNo;
	}

	public static void setBankNo(String bankNo) {
		JingleConfig.bankNo = bankNo;
	}

	public static String getHngpUrl() {
		return hngpUrl;
	}

	public static void setHngpUrl(String hngpUrl) {
		JingleConfig.hngpUrl = hngpUrl;
	}

	public static Integer getHngpUsername() {
		return hngpUsername;
	}

	public static void setHngpUsername(Integer hngpUsername) {
 		JingleConfig.hngpUsername = hngpUsername;
	}

	public static String getHngpPassword() {
		return hngpPassword;
	}

	public static void setHngpPassword(String hngpPassword)   {
		
		JingleConfig.hngpPassword = hngpPassword;
	}

	public static String getServiceUrl() {
		return serviceUrl;
	}

	public static void setServiceUrl(String serviceUrl) {
		JingleConfig.serviceUrl = serviceUrl;
	}

	public String getSystemName() {
		return systemName;
	}

	public void setSystemName(String systemName) {
		this.systemName = systemName;
	}

	
	
	
	public String getOfficeName() {
		return officeName;
	}

	public void setOfficeName(String officeName) {
		this.officeName = officeName;
	}

	public String getVersion()
    {
        return version;
    }

    public void setVersion(String version)
    {
        this.version = version;
    }

    public String getCopyrightYear()
    {
        return copyrightYear;
    }

    public void setCopyrightYear(String copyrightYear)
    {
        this.copyrightYear = copyrightYear;
    }

	public static String getUserId() {
		return userId;
	}

	public static void setUserId(String userId) {
		JingleConfig.userId = userId;
	}

	public static String getWebserviceUrl() {
		return webserviceUrl;
	}

	public static void setWebserviceUrl(String webserviceUrl) {
		JingleConfig.webserviceUrl = webserviceUrl;
	}

	public Integer getQueryNum() {
		return queryNum;
	}

	public void setQueryNum(Integer queryNum) {
		this.queryNum = queryNum;
	}

    public static String getProfile()
    {
        return profile;
    }

    public static void setProfile(String profile)
    {
    	JingleConfig.profile = profile;
    }

	public static String getPrivateKey() {
		return privateKey;
	}

	public static void setPrivateKey(String privateKey) {
		JingleConfig.privateKey = privateKey;
	}

	public static String getExportExcelPath() {
		return exportExcelPath;
	}

	public static void setExportExcelPath(String exportExcelPath) {
		JingleConfig.exportExcelPath = exportExcelPath;
	}

	public static String getStaticAccessPath() {
		return staticAccessPath;
	}

	public static void setStaticAccessPath(String staticAccessPath) {
		JingleConfig.staticAccessPath = staticAccessPath;
	}

	public static String getStaticAccess() {
		return staticAccess;
	}

	public static void setStaticAccess(String staticAccess) {
		JingleConfig.staticAccess = staticAccess;
	}

	public static String getFileExt() {
		return fileExt;
	}

	public static void setFileExt(String fileExt) {
		JingleConfig.fileExt = fileExt;
	}
    
    

}

4、controller

public String ueditorUpload(@RequestParam(value = "upfile", required = false) MultipartFile file, HttpServletResponse response, HttpServletRequest request) throws Exception {
		Map<String, Object> imgMap = new HashMap<String, Object>();

		try {

			String ext = FileUtil.extName(file.getOriginalFilename());
			imgMap.put("state", "FAILED");

			// if(JingleConfig.fileExt.contains(ext)){
			// String subFolder = "uploadfile" ;
			SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
			String dateString = "/" + simpleDateFormat.format(new Date());
			String path = FileUploadUtils.upload(ext + dateString, file);
			imgMap.put("url", path);
			imgMap.put("state", "SUCCESS");
			imgMap.put("title", file.getOriginalFilename());
			imgMap.put("original", file.getOriginalFilename());
			/*
			 * } else { imgMap.put("msg", "不支持上传"+ext+"类型文件"); }
			 */

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			imgMap.put("msg", "服务器异常" + e.getMessage());
		}

		return JSON.toJSONString(imgMap);
	}

5、工具类

package com.jingle.common.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException;
import org.apache.commons.io.IOUtils;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.springframework.web.multipart.MultipartFile;

import com.jingle.common.exception.file.FileNameLengthLimitExceededException;
import com.jingle.framework.config.JingleConfig;

import cn.hutool.core.io.FileUtil;
 

/**
 * 文件上传工具类
 * 
 * @author ruoyi
 */
public class FileUploadUtils
{

    // 默认大小 50M
    public static final long DEFAULT_MAX_SIZE = 52428800;

    // 默认上传的地址
    private static String defaultBaseDir = JingleConfig.getProfile();

    // 默认的文件名最大长度
    public static final int DEFAULT_FILE_NAME_LENGTH = 200;

    // 默认文件类型jpg
    public static final String IMAGE_JPG_EXTENSION = ".jpg";

    private static int counter = 0;

    public static void setDefaultBaseDir(String defaultBaseDir)
    {
        FileUploadUtils.defaultBaseDir = defaultBaseDir;
    }

    public static String getDefaultBaseDir()
    {
        return defaultBaseDir;
    }

    /**
     * 以默认配置进行文件上传
     *
     * @param file 上传的文件
     * @return 文件名称
     * @throws Exception
     */
    public static final String upload(MultipartFile file) throws IOException
    {
        try
        {
            return upload(getDefaultBaseDir(), file, FileUploadUtils.IMAGE_JPG_EXTENSION);
        }
        catch (Exception e)
        {
            throw new IOException(e);
        }
    }

    /**
     * 根据文件路径上传
     *
     * @param baseDir 相对应用的基目录
     * @param file 上传的文件
     * @return 文件名称
     * @throws IOException
     */
    public static final String upload(String uploadDir, MultipartFile file) throws IOException
    {
        try
        {
            return upload(uploadDir, file,"." +FileUtil.extName(file.getOriginalFilename()));
        }
        catch (Exception e)
        {
            throw new IOException(e);
        }
    }

    /**
     * 文件上传
     *
     * @param baseDir 相对应用的基目录
     * @param file 上传的文件
     * @param needDatePathAndRandomName 是否需要日期目录和随机文件名前缀
     * @param extension 上传文件类型
     * @return 返回上传成功的文件名
     * @throws FileSizeLimitExceededException 如果超出最大大小
     * @throws FileNameLengthLimitExceededException 文件名太长
     * @throws IOException 比如读写文件出错时
     */
    public static final String upload(String uploadDir, MultipartFile file, String extension)
            throws  IOException, FileNameLengthLimitExceededException, FileSizeLimitExceededException
    {

        int fileNamelength = file.getOriginalFilename().length();
        if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH)
        {
            throw new FileNameLengthLimitExceededException(file.getOriginalFilename(), fileNamelength,
                    FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
        }

        assertAllowed(file);

        String fileName = encodingFilename(file.getOriginalFilename(), extension);

        File desc = getAbsoluteFile(uploadDir,  fileName);
        file.transferTo(desc);
        return  JingleConfig.getStaticAccess()+"/"+uploadDir+"/"+fileName;
    }

    private static final File getAbsoluteFile(String uploadDir, String filename) throws IOException
    {
        File desc = new File(defaultBaseDir+File.separator+uploadDir+File.separator + filename);

        if (!desc.getParentFile().exists())
        {
            desc.getParentFile().mkdirs();
        }
        if (!desc.exists())
        {
            desc.createNewFile();
        }
        return desc;
    }

    /**
     * 编码文件名
     */
    private static final String encodingFilename(String filename, String extension)
    {
        filename = filename.replace("_", " ");
        filename = new Md5Hash(filename + System.nanoTime()).toHex().toString() + extension;
        return filename;
    }

    /**
     * 文件大小校验
     *
     * @param file 上传的文件
     * @return
     * @throws FileSizeLimitExceededException 如果超出最大大小
     */
    public static final void assertAllowed(MultipartFile file) throws FileSizeLimitExceededException
    {
        long size = file.getSize();
        if (DEFAULT_MAX_SIZE != -1 && size > DEFAULT_MAX_SIZE)
        {
            throw new FileSizeLimitExceededException("not allowed upload upload", size, DEFAULT_MAX_SIZE);
        }
    }
    
    
    public static void download(HttpServletResponse response, String filePath,String fileName) throws IOException
    {
    	 InputStream in = new FileInputStream(filePath);  
    	 fileName = URLEncoder.encode(fileName,"UTF-8");
         
         
        response.reset();
        response.setHeader("Content-Disposition", "attachment; filename="+fileName);
      //  response.addHeader("Content-Length", "" +in.);
        response.setContentType("application/octet-stream; charset=UTF-8");

        IOUtils.copy (in, response.getOutputStream());
    }
    
    
    

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值