ssm文件秒传

ssm框架中文件上传实现秒传

1 认识秒传

文件上传时:当文件已经在服务器存在,直接使用已存在的文件的目录,告诉客户端文件上传完毕

怎么判断两个文件是否完全相同:通过uuid/Md5获取文件的唯一标识码

2 这里通过uuid作为文件的唯一标识码来实现秒传

2.0 数据库

CREATE TABLE student (
  sid int(11) NOT NULL AUTO_INCREMENT,
  sname varchar(11) DEFAULT NULL,
  sbirthday date DEFAULT NULL,
  fname varchar(100) DEFAULT NULL
) 

CREATE TABLE tab_file(
   fname VARCHAR(100) PRIMARY KEY,
   fuuid VARCHAR(100)
);

2.1 先创建两个实体类,一个表示客户端,一个存储文件的信息

//客户端:student
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
	private Integer sid;
	private String sname;
	@DateTimeFormat(pattern="yyyy-MM-SS")
	private Date sbirthday;
	private String fname;//上传到数据库的文件名
}

//文件的信息
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MyFile implements Serializable{
	private String fname;//文件名字
	private String fuuid;//文件生成的uuid值
}

2.2 文件域上传表单

<!-- 注册用户信息 -->
<form action="<c:url value='/student/addOne.action'/>" method="post" enctype="multipart/form-data" id="form_666">
    <table>
        <tr>
            <th>学生名字:</th>
            <td><input type="text" name="sname"/><span id="span_sname"></span></td>
        </tr>
        <tr>
            <th>学生生日:</th>
            <td><input type="text" name="sbirthday" placeholder="格式:yyyy年MM月dd日"/></td>
        </tr>    
        <tr>
            <th>学生头像:</th>
            <td><input type="file" name="sphoto_file"/></td>
        </tr>
        <tr>
            <th colspan="2"><input type="submit" value="学生添加"/></th>
        </tr>
    </table>
</form>

2.3 在springmvc.xml中注册多部件表单解析器

<!-- 注册多部件表单解析器:id必须是 multipartResolver,
       指定上传文件的大小上限(字节数:10*1024*1024为10M),此处上限为10M-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="10485760"/>
</bean>

2.4 在web.xml中配置文件上传的位置

<!-- 设置文件默认上传位置 -->
<context-param>
    <param-name>upload_path</param-name>
    <param-value>C:\Users\Administrator\Desktop\upload</param-value>
</context-param>

2.5 action

@RequestMapping("/addOne.action")
public String addOneMethod(Student stu,@RequestParam("sphoto_file")MultipartFile file,HttpServletRequest req) throws Exception{
    //System.out.println("getOriginalFilename="+file.getOriginalFilename());//文件名字
    //System.out.println("getBytes111"+file.getBytes());//获取文件的字节
    //System.out.println(""+file.transferTo(file));//文件复制    
    String fuuid=UUID.nameUUIDFromBytes(file.getBytes()).toString();//获取上传的文件对应的的uuid 
    MyFile myFile=myFileService.getOneByFuuid(fuuid); //判断上传文件的uuid是否在数据库中存在
    String  fileName;   //上传到数据库的文件的名字
    if (myFile==null) {//文件不存在,上传文件        
        fileName=file.getOriginalFilename();//获取文件名字      
        fileName=System.currentTimeMillis()+"_"+fileName;//包装文件名,使其唯一        
        String path=req.getServletContext().getInitParameter("upload_path");//从配置中获取文件上传的位置
        File fileMuDi=new File(path,fileName);//创建目的文件           
        file.transferTo(fileMuDi);//实现文件的复制
        myFile=new MyFile(fileName, fuuid); //文件信息封装为文件对象      
        myFileService.addOne(myFile);//保存到数据库
        req.setAttribute("message", "文件上传成功!注册成功!");
    }else{//不走if语句即实现了秒传
        req.setAttribute("message", "<文件秒传成功!注册成功!>");
    }
    stu.setFname(myFile.getFname());//给客户端的文件名属性赋值
    studentService.addOne(stu);//添加学生 
    return "forward:/student/getAll.action";
}

2.6 添加service

@Service
public class StudentServiceImp implements StudentService{
	...
	@Override
	public int addOne(Student stu) {
		Student studentDb=studentMapper.getOneBySname(stu.getSname());
		if(studentDb!=null){
			throw new StudentCrudException("学生名字错误!");
		}
		return studentMapper.addOne(stu);
	}
}

@Service
public class MyFileServiceImp  implements MyFileService{
	@Autowired
	private MyFileMapper  myFileMapper;

	public MyFile getOneByFuuid(String fuuid) {
		return myFileMapper.getOneByFuuid(fuuid);
	}
	public int addOne(MyFile mf) {
		return myFileMapper.addOne(mf);
	}
}

2.7 mapper 数据库的操作 略

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值