Spring中文件的上传下载

ttms-9

1.文件上传业务分析?


1)将文件上传到服务器,然后存储到服务器的某个位置.
2)将已上传的文件相关信息存储到数据库.例如文件名,

 

文件大小,文件摘要信息,文件在服务器上的地址等.

 

2.SSM架构中文件上传的实现?

1)添加文件上传依赖?

Spring中文件的上传下载_第1张图片

2)spring-mvc中添加文件上传解析配制?

Spring中文件的上传下载_第2张图片

3)设置文件上传表单。

Spring中文件的上传下载_第3张图片

4)Spring controller中数据的接收?
        在spring中可以借助此MultipartFile类型

        的对象接收页面表单中上传的数据.

Spring中文件的上传下载_第4张图片

实现文件上传

Spring中文件的上传下载_第5张图片

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;


import cn.tedu.ttms.attachment.dao.AttachmentDao;
import cn.tedu.ttms.attachment.entity.Attachment;
import cn.tedu.ttms.attachment.service.AttachmentService;
import cn.tedu.ttms.common.exception.ServiceException;


@Service
public class AttachmentServiceImpl implements AttachmentService {
	@Autowired
	private AttachmentDao attachmentDao;
	/**实现文件上传
	 * 1)将文件存储到服务器
	 * 2)将文件信息存储到数据库
	 * */
	@Override
	public Attachment findObjectById(Integer id) {
		if(id==null)
		throw new ServiceException("id不能为空");
		Attachment a=attachmentDao.findObjectById(id);
		if(a==null)
		throw new ServiceException("对象已经不存在");
		return a;
	}
	@Override
	public void saveOject(String title,
			MultipartFile mFile) {
		//1.验证参数的有效性
		if(StringUtils.isEmpty(title))
		throw new ServiceException("title 不能为空");
		if(mFile==null)
		throw new ServiceException("请选择上传文件");
		if(mFile.isEmpty())
		throw new ServiceException("不允许上传空文件");
		//2.判定文件是否已上传(根据摘要信息)
		//2.1)根据mFile内容生成摘要信息(MD5)
		String digest=null;
		try{
		byte []bytes=mFile.getBytes();
		digest=//摘要字符串
		DigestUtils.md5DigestAsHex(bytes);
		}catch(Exception e){
		e.printStackTrace();
		throw new ServiceException("文件上传失败");
		}
		//2.2)根据摘要信息进行数据库查询
		int count=
		attachmentDao.getRowCountByDigest(digest);
		//2.3)根据查询的结果判定文件是否已上传
		if(count>0)
		throw new ServiceException("文件已经上传");
		//3.假如文件不在则上传文件
		SimpleDateFormat sdf=
		new SimpleDateFormat("yyyy/MM/dd");
		String dateDir=sdf.format(new Date());
		File fileDir=new File("e:/uploads/"+dateDir);
		//判定目录是否存在,不存在则创建
		if(!fileDir.exists())fileDir.mkdirs();
		//构建文件对象(fileDir为目录,mFile.getOriginalFilename()文件名)
		File dest=new File(fileDir,
				           mFile.getOriginalFilename());
		try{
		//上传文件
		mFile.transferTo(dest);
		}catch(Exception e){
		e.printStackTrace();
		throw new ServiceException("文件上传失败");
		}
		//4.将文件信息保存到数据库
		Attachment a=new Attachment();
		a.setTitle(title);
		a.setFileName(mFile.getOriginalFilename());
		a.setFileDisgest(digest);
        a.setFilePath(dest.getPath());	
        a.setContentType(mFile.getContentType());
        int rows=attachmentDao.insertObject(a);
		//5.验证保存结果
        if(rows<=0)
        throw new ServiceException("数据保存失败");
	}
	@Override
	public List findObjects() {
		return attachmentDao.findObjects();
	}


}

 

 

 

Spring中文件的下载

a
1.设置下载时的响应头(必须设置,固定格式)

 response.setContentType("application/octet-stream");
File fileName=new String(fileName.getBytes("iso-8859-1"),"utf-8");
中文文件名可能有乱码,通过如下语句对文件名编码
String fileName=URLEncoder.encode(
a.getFileName(),"utf-8");
response.setHeader("Content-disposition",
"attachment;filename="+fileName);


2.返回要下载数据,交给浏览器下载
根据文件路径构建一个Path
Path path=Paths.get(a.getFilePath());
读取指定路径下的文件字节

return  Files.readAllBytes(path);

Spring中文件的上传下载_第6张图片

 

你可能感兴趣的:(spring,文件上传下载)