在Sevlet 3 以前,Servlet API中没有支持上传功能的API,因此要实现上传功能需要引入第三方工具从POST请求中获得上传的附件或者通过自行处理输入流来获得上传的文件,我们推荐使用Apache的commons-fileupload。然而从Servlet 3开始,文件上传就变得无比简单。
文件下载
//文件下载功能
// 前台页面我用的是Easyui框架写的前台页面
<!-- 页面加载开始 -->
<div id="panel_datagrid_uploads_m080" title="文件上传" data-options="fit:true" border="false">
<div id="toolbar_uploads_m080">
<a href="#" data-options="iconCls:'icon-add',plain:true" onclick="openDownloadsAdd_m080()">文件下载</a>
</div>
</div>
<!--页面加载结束-->
<!--打开文件下载窗口开始 -->
<div id="dialog_add_downloads_m080"
style="display: none; top: 10%; width: 600px; height: 400px; padding: 10px 20px">
<a href="" id="ssUrl">文件下载</a>
</div>
<!--打开文件下载窗口结束 -->
//页面所对应的的js文件
//文件下载
//dialog
var dialog_add_downloads_m080;
function openDownloadsAdd_m080(){
dialog_add_downloads_m080=$('#dialog_add_downloads_m080').show().dialog({
title:'文件下载',
modal:true
});
}
//文件下载 filename是需要从数据库查询出来现将定义成固定值myfile.txt
var filename="myfile.txt";
$("#ssUrl").attr('href',"uploadfile/download?filename="+filename);
// java后台代码篇
@RequestMapping(value = {"/download"},method = RequestMethod.GET)
public void download(@RequestParam("filename") String filename, HttpServletRequest request,HttpServletResponse response) throws IOException {
if(!StringUtils.isEmpty(filename)) {
//模拟文件,myfile.txt为需要下载的文件
String path = "D:\\file"+"\\"+filename;
//创建添加定义获取文件
File file=new File(path);
//创建添加定义获取该文件的文件输入流
FileInputStream fileInputStream=new FileInputStream(file);
//创建添加定义将文件输入流放在输入流里
InputStream inputStream=new BufferedInputStream(fileInputStream);
//创建添加定义转码防止文件名中文乱码
filename=URLEncoder.encode(filename,"UTF-8");
//创建添加定义设置文件下载头
response.setHeader("Content-Disposition", "attachment;filename=" + filename);
//创建添加定义设置下载文件类型
response.setContentType("multipart/form-data");
//创建添加定义获取文件输出流
BufferedOutputStream bufferedOutputStream=new BufferedOutputStream(response.getOutputStream());
int len=0;
while((len = inputStream.read()) != -1){
bufferedOutputStream.write(len);
bufferedOutputStream.flush();
}
bufferedOutputStream.close();
}
}
文件下载功能注意几点,我的下载的路径固定为"D:\file"+"\"+filename;这个路径,也可是Tomcat发布好的webapps下。注意文件名的拼写,注意路径的配置。
文件上传
文件上传的第一种方式(直接使用form表单提交)
// 直接使用form表单提交
<div>
<!-- 第一种方式直接使用form表单的方式实现文件上传 -->
<form action="${pageContext.request.contextPath}/user/uploadfile/uploadfile1" method="post" enctype="multipart/form-data">
<input type="file" name="ffFile" />
<input type="submit" value="上传" />
</form>
</div>
//后台java代码
/**
* 创建添加定义一个使用Spring实现文件上传
* @param request
* @return
* @throws IOException
* @throws IllegalStateException
*/
@RequestMapping("/uploadfile1")
@ResponseBody
public ResultJson springUpload1(HttpServletRequest request) throws IllegalStateException, IOException {
ResultJson resultJson=new ResultJson();
//获取从1970年到现在的毫秒数
Long startTime=System.currentTimeMillis();
//将当前上下文初始化给CommonsMultipartResolver(多部分解析器)
CommonsMultipartResolver commonsMultipartResolver=new CommonsMultipartResolver(request.getSession().getServletContext());
//检查form表单中有没有enctype="multipart/form-data"这个属性
if(commonsMultipartResolver.isMultipart(request))
{
//将request转换成多部分请求
MultipartHttpServletRequest multipartHttpServletRequest=(MultipartHttpServletRequest) request;
//获取multipartHttpServletRequest的所有的文件名
Iterator irIterator=multipartHttpServletRequest.getFileNames();
while(irIterator.hasNext()) {
MultipartFile multipartFile=multipartHttpServletRequest.getFile(irIterator.next().toString());
if(multipartFile!=null){
String path="E:/springUpload/"+multipartFile.getOriginalFilename();
// 检查该路径对应的目录是否存在,如果不存在则创建目录
File dir = new File(path);
if (!dir.exists()) {
dir.mkdirs();
}
//上传
multipartFile.transferTo(new File(path));
}
}
}
Long endTime=System.currentTimeMillis();
System.out.println("文件上传一共用时 "+String.valueOf(endTime-startTime)+" 毫秒");
return resultJson;
}
文件上传的第二种方式(使用ajax的formData的方式实现文件上传)
//使用ajax的formData的方式实现文件上传
// 前台页面使用ajax的formData的方式实现文件上传
<!--第二种方式使用ajax的formData的方式实现文件上传 -->
<!--打开文件上传窗口开始 -->
<div id="dialog_add_uploads_m080"
style="display: none; top: 10%; width: 600px; height: 400px; padding: 10px 20px">
<form id="tf">
<input class="easyui-filebox" name="ffFile"/>
<input data-options="iconCls:'icon-ok'" value="文件上传" onclick="test();" "/>
</form>
</div>
<!--打开文件上传窗口结束 -->
// 前台页面所对应的js文件
//文件上传1
// add dialog
var dialog_add_uploads_m080;
function openUploadsAdd1_m080(){
dialog_add_uploads_m080=$('#dialog_add_uploads_m080').show().dialog({
title:'文件上传1',
modal:true
});
}
//这个是在jsp页面中写的js,需要获取项目的根路径不可以使用相对路径
<script type="text/javascript">
var rootPath="${pageContext.request.contextPath}";
function test(){
var form = new FormData(document.getElementById("tf"));
$.ajax({
url:rootPath+"/user/uploadfile/uploadfile",
type:"post",
data:form,
cache: false,
processData:false,
contentType:false,
success:function(data){
if(data!=null){
console.log("成功不为空");
alert("成功不为空!");
}else{
console.log("失败为空");
alert("失败!");
}
},
error:function(e){
alert("错误!!"+e);
window.close();
}
});
}
</script>
// java后台代码
// 第二种方式使用ajax的formData的方式实现文件上传
/**
* 创建添加定义一个 使用Spring实现文件上传
*
* @return
*/
@RequestMapping("/uploadfile")
@ResponseBody
public ResultJson springUpload(HttpServletRequest request) {
ResultJson json = new ResultJson();
MultipartFile uploadFile = ((MultipartHttpServletRequest) request).getFile("ffFile");
uploadFile(uploadFile, request);
return json;
}
public String uploadFile(MultipartFile multipartFile,HttpServletRequest request) {
String fileName = null;
System.out.println("------------------------------------0202020202020202------------------------------------");
if (multipartFile != null) {
DateFormat format = new SimpleDateFormat("yyyyMMddHHmmssSSS");
String orgFileName = multipartFile.getOriginalFilename();
//fileName = format.format(new Date()) + orgFileName;
if(!SysUtil.isNULL(orgFileName)){
fileName = format.format(new Date()) + "-" + orgFileName;
// 设置保存路径
String path = request.getServletContext().getRealPath("/upload");
// 检查该路径对应的目录是否存在,如果不存在则创建目录
File dir = new File(path);
if (!dir.exists()) {
dir.mkdirs();
}
String filePath = path + "\\" + fileName;
System.out.println(filePath + "controller path");
File file = new File(filePath);
try {
multipartFile.transferTo(file);
} catch (IllegalStateException e) {
System.out.println(e.getMessage());
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
return fileName;
}