重 点:前、后台数据交互、AJax异步加载数据、文件读取
难 点:文件读取
内 容:登录成功后,上传文件。
图1 文件上传页面
在WebContent/js目录下创建index.js文件,添加upload()方法,用于上传文件;当触发上传事件时,通过Ajax向后台传输数据,核心代码如下所示;
function upload(){
var files = document.getElementById("input").files;
if(files.length==0) {
alert("请选择文件");
return;
}
var index = layer.load(1, {
shade: [0.75,'#fff'] /0.1透明度的白色背景
});
var formData=new FormData();
for(var i=0;i<files.length;i++) {
formData.append("files",files[i]);
}
formData.append("currentPath", currentPath);
$.ajax({
url: 'file/upload.action',
type: 'POST',
cache: false,
processData: false,
contentType: false,
data : formData,
success : function(data) {
if (data.success == true) {
getFiles(currentPath);
layer.closeAll('loading');
}
},
});
}
在FileController中添加upload()方法,用于处理文件上传并返回上传结果给前台,代码如下所示;
@Controller
@RequestMapping("/file")
public class FileController {
@Autowired
private HttpServletRequest request;
@Autowired
private FileService fileService;
/**
* 文件上传
*
* @param files
* 文件名(多个)
* @param currentPath
* 当前路径
* @return Json对象
*/
@RequestMapping("/upload")
public @ResponseBody Result<String> upload(
@RequestParam("files") MultipartFile[] files, String currentPath) {
try {
fileService.uploadFilePath(request, files, currentPath);
} catch (Exception e) {
return new Result<>(301, false, "上传失败");
}
return new Result<String>(305, true, "上传成功");
}
}
在FileService中添加uploadFilePath()方法,用于实现文件的上传,通过循环的方式一次上传多个文件。在保存文档时,需将文件写入tomcat服务器中对应的用户目录下,并对于office文件(如docx、xlsx等格式),需借助于百度云盘进行保存,以便后期直接在线阅览此类文档,代码如下所示;
@Service
public class FileService {
/**
* 文件相对前缀
*/
public static final String PREFIX = "WEB-INF" + File.separator + "file" + File.separator;
/**
* 新用户注册默认文件夹
*/
public static final String[] DEFAULT_DIRECTORY = { "vido", "music", "source", "image", User.RECYCLE };
@Autowired
private UserDao userDao;
@Autowired
private FileDao fileDao;
/**
* 上传文件
*
* @param request
* @param files
* 文件
* @param currentPath
* 当前路径
* @throws Exception
*/
public void uploadFilePath(HttpServletRequest request, MultipartFile[] files, String currentPath) throws Exception {
for (MultipartFile file : files) {
String fileName = file.getOriginalFilename();
String filePath = getFileName(request, currentPath);
File distFile = new File(filePath, fileName);
if (!distFile.exists()) {
file.transferTo(distFile);
if ("office".equals(FileUtils.getFileType(distFile))) {
try {
String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
String documentId = FileUtils.getDocClient().createDocument(distFile, fileName, suffix)
.getDocumentId();
officeDao.addOffice(documentId, FileUtils.MD5(distFile));
} catch (Exception e) {
}
}
}
}
reSize(request);
}
……
}
在FileService类中增加reSize()方法,当文件保存成功之后,需重新计算改用户的上传文件的大小,并将更新后的大小数据保存至数据库中,核心代码如下所示;
/**
* 重新计算文件大小
*
* @param request
*/
public void reSize(HttpServletRequest request) {
String userName = UserUtils.getUsername(request);
try {
userDao.reSize(userName, countFileSize(request));
} catch (Exception e) {
e.printStackTrace();
}
}
在FileService类中添加countFileSize()方法,用于计算该用户已上传文件的总大小,核心代码如下所示;
/**
* 统计用户文件大小
*
* @param request
* @return
*/
public String countFileSize(HttpServletRequest request) {
long countFileSize = countFileSize(new File(getFileName(request, null)));
return FileUtils.getDataSize(countFileSize);
}
在UserDao.xml文件中,添加更新SQL语句,将更新后用户所使用的空间大小保存至数据库,代码如下所示;
<?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="cn.allene.yun.dao.UserDao" >
……
<update id="reSize">
update user set countSize = #{formatSize} where username = #{username}
</update>
……
</mapper>
UserDao.xml文件中,添加查询SQL语句,用于查询最新的用户空间使用情况,代码如下所示;
<?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="cn.allene.yun.dao.UserDao" >
……
<select id="getCountSize" parameterType="java.lang.String" resultType="java.lang.String">
select countSize from user where username = #{username}
</select>
……
</mapper>