在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现,重点在文件上传
对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件。这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,struts上传的功能就是基于这个实现的。common-fileupload是依赖于common-io这个包的,所以还需要下载这个包。
一、开发环境搭建
创建一个FileUploadAndDownLoad项目,加入Apache的commons-fileupload文件上传组件的相关Jar包,如下图所示:
二、实现文件上传
2.1 文件上传页面
upload.html代码如下
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
< div >
< h5 >文件上传</ h5 >< hr />
< form id = "file_upload_id" name = "file_upload_name" >
< div >< input type = "file" name = "file_upload" /></ div >
< div onclick = "upload()" >< input type = "button" value = "上传" /></ div >< br >
< div >
< span id = "typeValue" ></ span >
< input id = "type" type = "hidden" name = "input_type" >
</ div >
< div >
< span id = "sizeValue" ></ span >
< input id = "size" type = "hidden" name = "input_size" >
</ div >
</ form >
</ div >
< script >
$(function(){
a();
});
function a(){
var size=1024 * 1024 * 50;
var type=
"gif,jpg,jpeg,png,bmp,swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb,doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2,jsp";
$("#type").val(type);//利用input传值到后台
$("#typeValue").html("文件格式限制为:"+type);//显示
$("#size").val(size);
$("#sizeValue").html("文件大小限制为:"+size);
}
function upload(){
var formdata = new FormData($('#file_upload_id')[0]);
$.ajax({
url: 'cloud/load/upload',
type: 'POST',
data: formdata,
dataType:'JSON',
cache: false,
processData: false,
contentType: false ,
success : function(date){
alert("success");
},
error : function(e){
alert("error");
}
});
}
</ script >
|
2.2 controller
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
package com.cloud.web.controller;
import java.io.IOException;
import java.util.HashMap;
import javax.annotation.Resource;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import com.cloud.web.service.FileLoadService;
@Controller
@RequestMapping ( "/load" )
public class LoadController {
@Resource
public FileLoadService fileLoadService;
@RequestMapping (value = "/upload" , method = RequestMethod.POST)
@ResponseBody
public HashMap<String,Object> upload( @RequestParam ( "file_upload" ) MultipartFile file, @RequestParam ( "input_type" ) String extName, @RequestParam ( "input_size" ) String size, HttpServletRequest request, HttpServletResponse response, ModelMap model) throws ServletException, IOException {
HashMap<String,Object> map = new HashMap<String,Object>();
request.setCharacterEncoding( "UTF-8" ); // 解决上传的中文文件乱码问题
response.setContentType( "text/html;charset=UTF-8" );
long fileSizeMax=Long.parseLong(size);
String mes =fileLoadService.doUpload(file,request, extName, fileSizeMax);
map.put( "mes" , mes);
return map;
}
}
|
2.3 service
FileLoadServiceImpl.java程序如下:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
package com.cloud.web.service.impl;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.cloud.web.service.FileLoadService;
@Service
public class FileLoadServiceImpl implements FileLoadService{
@Override
public String doUpload(MultipartFile file, HttpServletRequest request, String extName, long fileSizeMax) throws ServletException, IOException{
// 存放路径
String realPath = request.getSession().getServletContext().getRealPath( "/WEB-INF/" )+ "/upload/test/" ;
String msg= "" ; //返回消息
try {
String fileName = file.getOriginalFilename(); // 获取上传的文件的文件名
String fileExt = fileName.substring(fileName.lastIndexOf( "." ) + 1 ).toLowerCase(); // 获取上传文件的扩展名
if (fileName != null ) {
System.out.println( "上传的文件的扩展名是:" + fileExt);
if (!extName.contains(fileExt)){
System.out.println( "上传文件扩展名是不允许的扩展名:" + fileExt);
msg = msg + "文件:" + fileName + ",上传文件扩展名是不允许的扩展" ;
} else if (file.getSize() > fileSizeMax){
// 如果需要限制上传的文件大小,不超过最大限制
System.out.println( "上传文件大小:" + file.getSize());
msg = msg + "文件:" + fileName + ",上传文件大小超过限制大小" ;
} else {
Date now = new Date();
DateFormat df = new SimpleDateFormat( "yyyyMMddHHmmss" );
String str = df.format(now);
String nFileName=str+ "_" +fileName;
// 生成一个子目录
String childDirectory = genChildDirectory(realPath);
File storeDirectory = new File(realPath + File.separator + childDirectory);
//如果目录不存在,就创建一个
if (!storeDirectory.exists()) {
storeDirectory.mkdirs();
}
// 获取item中的上传文件的输入流
InputStream is = file.getInputStream();
//创建一个文件输出流
FileOutputStream out = new FileOutputStream(storeDirectory + "\\\\" + nFileName);
//创建一个缓冲区
byte buffer[] = new byte [ 1024 ];
//判断输入流中的数据是否已经读完的标致
int len = 0 ;
while ((len = is.read(buffer)) > 0 ){
out.write(buffer, 0 , len);
}
out.close(); //关闭输出流
is.close(); //关闭输入流
msg= "file:" + fileName + ",success" ;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return msg;
}
// 按照时间创建分目录 放置一个文件夹下面的文件过多
@Override
public String genChildDirectory(String realPath) {
Date now = new Date();
DateFormat df = new SimpleDateFormat( "yyyy-MM-dd" );
String str = df.format(now);
File file = new File(realPath, str);
if (!file.exists()) {
file.mkdirs();
}
return str;
}
}
|
相关文章
猜你喜欢
- 64M VPS建站:如何选择最适合的网站建设平台? 2025-06-10
- ASP.NET本地开发时常见的配置错误及解决方法? 2025-06-10
- ASP.NET自助建站系统的数据库备份与恢复操作指南 2025-06-10
- 个人网站服务器域名解析设置指南:从购买到绑定全流程 2025-06-10
- 个人网站搭建:如何挑选具有弹性扩展能力的服务器? 2025-06-10
TA的动态
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
您的支持,是我们最大的动力!
热门文章
-
2025-05-29 41
-
2025-05-25 94
-
2025-05-29 57
-
利用VS2025创建Web项目,并发送到IIS,以及IIS与ASP.NET配置
2025-05-29 18 -
2025-06-04 97
热门评论