1. 程式人生 > >spring boot中檔案的上傳

spring boot中檔案的上傳

在spring boot中上傳檔案,這時候,在HTML中將檔案的type設定為file型別。

然後在資料庫裡邊儲存的時候,實際上庫裡儲存的是檔案的檔案的型別,檔名,以及檔案的URL路徑,真正的檔案是儲存在伺服器上的。

controller層:

package com.bootdo.common.controller;

import com.bootdo.common.config.BootdoConfig;
import com.bootdo.common.domain.FileDO;
import com.bootdo.common.service.FileService;
import com.bootdo.common.utils.*;
import javax.servlet.http.HttpServletRequest;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 檔案上傳
 * 
 * @author chglee
 * @email 
[email protected]
* @date 2017-09-19 16:02:20 */ @Controller @RequestMapping("/common/sysFile") public class FileController extends BaseController { @Autowired private FileService sysFileService; @Autowired private BootdoConfig bootdoConfig; @GetMapping() @RequiresPermissions("common:sysFile:sysFile") String sysFile(Model model) { Map<String, Object> params = new HashMap<>(16); return "common/file/file"; } @ResponseBody @GetMapping("/list") @RequiresPermissions("common:sysFile:sysFile") public PageUtils list(@RequestParam Map<String, Object> params) { // 查詢列表資料 Query query = new Query(params); List<FileDO> sysFileList = sysFileService.list(query); int total = sysFileService.count(query); PageUtils pageUtils = new PageUtils(sysFileList, total); return pageUtils; } @GetMapping("/add") // @RequiresPermissions("common:bComments") String add() { return "common/sysFile/add"; } @GetMapping("/edit") // @RequiresPermissions("common:bComments") String edit(Long id, Model model) { FileDO sysFile = sysFileService.get(id); model.addAttribute("sysFile", sysFile); return "common/sysFile/edit"; } /** * 資訊 */ @RequestMapping("/info/{id}") @RequiresPermissions("common:info") public R info(@PathVariable("id") Long id) { FileDO sysFile = sysFileService.get(id); return R.ok().put("sysFile", sysFile); } /** * 儲存 */ @ResponseBody @PostMapping("/save") @RequiresPermissions("common:save") public R save(FileDO sysFile) { if (sysFileService.save(sysFile) > 0) { return R.ok(); } return R.error(); } /** * 修改 */ @RequestMapping("/update") @RequiresPermissions("common:update") public R update(@RequestBody FileDO sysFile) { sysFileService.update(sysFile); return R.ok(); } /** * 刪除 */ @PostMapping("/remove") @ResponseBody // @RequiresPermissions("common:remove") public R remove(Long id, HttpServletRequest request) { if ("test".equals(getUsername())) { return R.error(1, "演示系統不允許修改,完整體驗請部署程式"); } String fileName = bootdoConfig.getUploadPath() + sysFileService.get(id).getUrl().replace("/files/", ""); if (sysFileService.remove(id) > 0) { boolean b = FileUtil.deleteFile(fileName); if (!b) { return R.error("資料庫記錄刪除成功,檔案刪除失敗"); } return R.ok(); } else { return R.error(); } } /** * 刪除 */ @PostMapping("/batchRemove") @ResponseBody @RequiresPermissions("common:remove") public R remove(@RequestParam("ids[]") Long[] ids) { if ("test".equals(getUsername())) { return R.error(1, "演示系統不允許修改,完整體驗請部署程式"); } sysFileService.batchRemove(ids); return R.ok(); } @ResponseBody @PostMapping("/upload") R upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) { if ("test".equals(getUsername())) { return R.error(1, "演示系統不允許修改,完整體驗請部署程式"); } String fileName = file.getOriginalFilename(); fileName = FileUtil.renameToUUID(fileName); FileDO sysFile = new FileDO(FileType.fileType(fileName), "/files/" + fileName, new Date()); try { FileUtil.uploadFile(file.getBytes(), bootdoConfig.getUploadPath(), fileName); } catch (Exception e) { return R.error(); } if (sysFileService.save(sysFile) > 0) { return R.ok().put("fileName",sysFile.getUrl()); } return R.error(); } }

實體類:

package com.bootdo.common.domain;

import java.io.Serializable;
import java.util.Date;

/**
 * 檔案上傳
 *
 * @author chglee
 * @email [email protected]
 * @date 2017-09-19 16:02:20
 */
public class FileDO implements Serializable {
    private static final long serialVersionUID = 1L;

    //
    private Long id;
    // 檔案型別
    private Integer type;
    // URL地址
    private String url;
    // 建立時間
    private Date createDate;


    public FileDO() {
        super();
    }


    public FileDO(Integer type, String url, Date createDate) {
        super();
        this.type = type;
        this.url = url;
        this.createDate = createDate;
    }


    /**
     * 設定:
     */
    public void setId(Long id) {
        this.id = id;
    }

    /**
     * 獲取:
     */
    public Long getId() {
        return id;
    }

    /**
     * 設定:檔案型別
     */
    public void setType(Integer type) {
        this.type = type;
    }

    /**
     * 獲取:檔案型別
     */
    public Integer getType() {
        return type;
    }

    /**
     * 設定:URL地址
     */
    public void setUrl(String url) {
        this.url = url;
    }

    /**
     * 獲取:URL地址
     */
    public String getUrl() {
        return url;
    }

    /**
     * 設定:建立時間
     */
    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }

    /**
     * 獲取:建立時間
     */
    public Date getCreateDate() {
        return createDate;
    }

    @Override
    public String toString() {
        return "FileDO{" +
                "id=" + id +
                ", type=" + type +
                ", url='" + url + '\'' +
                ", createDate=" + createDate +
                '}';
    }
}

dao層 

package com.bootdo.common.dao;

import com.bootdo.common.domain.FileDO;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Mapper;

/**
 * 檔案上傳
 * @author chglee
 * @email [email protected]
 * @date 2017-10-03 15:45:42
 */
@Mapper
public interface FileDao {

	FileDO get(Long id);
	
	List<FileDO> list(Map<String,Object> map);
	
	int count(Map<String,Object> map);
	
	int save(FileDO file);
	
	int update(FileDO file);
	
	int remove(Long id);
	
	int batchRemove(Long[] ids);
}

service層:

package com.bootdo.common.service;

import com.bootdo.common.domain.FileDO;

import java.util.List;
import java.util.Map;

/**
 * 檔案上傳
 * 
 * @author chglee
 * @email [email protected]
 * @date 2017-09-19 16:02:20
 */
public interface FileService {
	
	FileDO get(Long id);
	
	List<FileDO> list(Map<String, Object> map);
	
	int count(Map<String, Object> map);
	
	int save(FileDO sysFile);
	
	int update(FileDO sysFile);
	
	int remove(Long id);
	
	int batchRemove(Long[] ids);

	/**
	 * 判斷一個檔案是否存在
	 * @param url FileDO中存的路徑
	 * @return
	 */
    Boolean isExist(String url);
}

serviceImpl層:

package com.bootdo.common.service.impl;

import com.bootdo.common.config.BootdoConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.File;
import java.util.List;
import java.util.Map;

import com.bootdo.common.dao.FileDao;
import com.bootdo.common.domain.FileDO;
import com.bootdo.common.service.FileService;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;


@Service
public class FileServiceImpl implements FileService {
	@Autowired
	private FileDao sysFileMapper;

	@Autowired
	private BootdoConfig bootdoConfig;
	@Override
	public FileDO get(Long id){
		return sysFileMapper.get(id);
	}
	
	@Override
	public List<FileDO> list(Map<String, Object> map){
		return sysFileMapper.list(map);
	}
	
	@Override
	public int count(Map<String, Object> map){
		return sysFileMapper.count(map);
	}
	
	@Override
	public int save(FileDO sysFile){
		return sysFileMapper.save(sysFile);
	}
	
	@Override
	public int update(FileDO sysFile){
		return sysFileMapper.update(sysFile);
	}
	
	@Override
	public int remove(Long id){
		return sysFileMapper.remove(id);
	}
	
	@Override
	public int batchRemove(Long[] ids){
		return sysFileMapper.batchRemove(ids);
	}

    @Override
    public Boolean isExist(String url) {
		Boolean isExist = false;
		if (!StringUtils.isEmpty(url)) {
			String filePath = url.replace("/files/", "");
			filePath = bootdoConfig.getUploadPath() + filePath;
			File file = new File(filePath);
			if (file.exists()) {
				isExist = true;
			}
		}
		return isExist;
	}
	}

XML檔案:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.bootdo.common.dao.FileDao">

	<select id="get" resultType="com.bootdo.common.domain.FileDO">
		select `id`,`type`,`url`,`create_date` from sys_file where id = #{value}
	</select>

	<select id="list" resultType="com.bootdo.common.domain.FileDO">
		select `id`,`type`,`url`,`create_date` from sys_file
        <where>  
		  		  <if test="id != null and id != ''"> and id = #{id} </if>
		  		  <if test="type != null and type != ''"> and type = #{type} </if>
		  		  <if test="url != null and url != ''"> and url = #{url} </if>
		  		  <if test="createDate != null and createDate != ''"> and create_date = #{createDate} </if>
		  		</where>
        <choose>
            <when test="sort != null and sort.trim() != ''">
                order by ${sort} ${order}
            </when>
			<otherwise>
                order by id desc
			</otherwise>
        </choose>
		<if test="offset != null and limit != null">
			limit #{offset}, #{limit}
		</if>
	</select>
	
 	<select id="count" resultType="int">
		select count(*) from sys_file
		 <where>  
		  		  <if test="id != null and id != ''"> and id = #{id} </if>
		  		  <if test="type != null and type != ''"> and type = #{type} </if>
		  		  <if test="url != null and url != ''"> and url = #{url} </if>
		  		  <if test="createDate != null and createDate != ''"> and create_date = #{createDate} </if>
		  		</where>
	</select>
	 
	<insert id="save" parameterType="com.bootdo.common.domain.FileDO" useGeneratedKeys="true" keyProperty="id">
		insert into sys_file
		(
			`type`, 
			`url`, 
			`create_date`
		)
		values
		(
			#{type}, 
			#{url}, 
			#{createDate}
		)
	</insert>
	 
	<update id="update" parameterType="com.bootdo.common.domain.FileDO">
		update sys_file 
		<set>
			<if test="type != null">`type` = #{type}, </if>
			<if test="url != null">`url` = #{url}, </if>
			<if test="createDate != null">`create_date` = #{createDate}</if>
		</set>
		where id = #{id}
	</update>
	
	<delete id="remove">
		delete from sys_file where id = #{value}
	</delete>
	
	<delete id="batchRemove">
		delete from sys_file where id in 
		<foreach item="id" collection="array" open="(" separator="," close=")">
			#{id}
		</foreach>
	</delete>

</mapper>