您的位置:首页 > 编程语言 > Java开发

Java+jsp+Servlet实现文件上传和下载

2017-06-19 18:04 956 查看

文件的上传和下载---学习笔记

2016-06-26 22:26
502人阅读 评论(0)
收藏
举报

本文章已收录于:


分类:
java(74)




作者同类文章X

版权声明:本文为博主原创文章,未经博主允许不得转载。

目录(?)[+]
文件上传原理
文件下载原理
使用SmartUpload实现文件的上传和下载

文件上传原理

在TCP/IP中,最早出现的文件上传机制是FTP。它是将文件由客户端发送到服务器的标准机制。

但是JSP编程中不能使用FTP方法来上传文件,这是由JSP运行机制所决定的。

JSP中上传文件的解决方式:

通过为表单元素设置

Method = “post”

enctype = “multipart/form-data”

属性,让表单提交的数据以二进制编码的方式提交,在接受此请求的Servlet中用二进制流来获取内容,就可以取得上传文件的内容,从而实现文件的上传。

表单中enctype属性说明:

enctype属性的值有三种:

application/x-www-form=urlencoded:这是默认编码方式,它只处理表单域里的value属性值,采用这种编码方式的表单会将表单域的值处理成URL编码方式。
multipart/form-data:这种编码方式的表单会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数里。
text/plain:这种方式主要适用于直接通过表单发送邮件的方式
文件上传的实现步骤:

环境搭建:配置web.xml创建UploadServlet
前台页面配置:Form的method设置为post,enctype设置为multipart/form-data
后台Servlet实现:保存上传文件
上传文件的后台实现的具体步骤:

获取request当中的流信息,保存到临时文件
从临时文件当中得到上传的文件名及文件内容起止位置
根据文件起止位置,读取上传文件内容,保存到本地
文件的上传:

//文件上传
private void uploadFile(HttpServletRequest request, HttpServletResponse response)
throws IOException, FileNotFoundException, ServletException {
// 从request当中获取流信息
InputStream is = request.getInputStream();
// 在本地创建临时文件
String tempFileName = "C:\\Users\\Administrator\\Desktop\\tempFile";
File tempFile = new File(tempFileName);

// 将request请求中的所有信息写入临时文件中
FileOutputStream fos = new FileOutputStream(tempFile);
byte[] b = new byte[1024];
int n;
while ((n = is.read(b)) != -1) {
fos.write(b, 0, n);
}
fos.close();
is.close();

// 获取临时文件中的上传文件的文件名
RandomAccessFile randomFile = new RandomAccessFile(tempFile, "r");
randomFile.readLine();// 读取第一行数据
String str = randomFile.readLine();// 读取第二行的内容
int beginIndex = str.lastIndexOf("\\") + 1;
System.out.println("开始位置:"+beginIndex);
int endIndex = str.lastIndexOf("\"");
String filename = str.substring(beginIndex, endIndex);
System.out.println("文件名:"+filename);

//获取文件内容的开始位置
randomFile.seek(0);//重新将定位文件指针定位到文件头
long startPosition = 0;
int i = 1;
while((n = randomFile.readByte())!=-1&&i<=4){
if(n=='\n'){
startPosition = randomFile.getFilePointer();
i++;
}
}
startPosition = randomFile.getFilePointer()-1;

//获取文件内容的结束位置
randomFile.seek(randomFile.length());//定义文件指针到文件结尾
long endPosition = randomFile.getFilePointer();
int j = 1;
while(endPosition>=0&&j<=2){
endPosition--;
randomFile.seek(endPosition);
if(randomFile.readByte()=='\n'){
j++;
}
}
endPosition = endPosition-1;

//设置保存上传文件的路径
String realPath = getServletContext().getRealPath("/")+"images";
System.out.println("上传文件的路径:"+realPath);
File fileupload = new File(realPath);
if(!fileupload.exists()){
fileupload.mkdir();
}
File saveFile = new File(realPath,filename);
RandomAccessFile randomAccessFile = new RandomAccessFile(saveFile, "rw");
//从临时文件当中读取文件内容(根据起止位置获取)
randomFile.seek(startPosition);
while(startPosition<endPosition){
randomAccessFile.write(randomFile.readByte());
startPosition = randomFile.getFilePointer();
}
//关闭输入输出流、删除临时文件
randomFile.close();
randomAccessFile.close();
tempFile.delete();

request.setAttribute("result", "上传成功!");
RequestDispatcher dispatcher = request.getRequestDispatcher("jsp/01.jsp");
dispatcher.forward(request, response);
}
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


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

文件下载原理

文件下载的步骤:

需要通过HttpServletResponse.setContentType方法设置Content-Type头字段的值,位浏览器无法使用某种方式或激活某个程序来处理的MIME类型,例如:“application/octet-stream”或“application/x-msdownload”等。
需要通过HttpServletResponse.setHeader方法设置Content-Disposition头的值为“attachment;filename=”文件名””。
读取下载文件,调用HttpServletResponse.getOutputStream方法返回的ServletOutputStream对象来向客户端写入附件文件内容。
实现步骤:

前台页面开发:通过超链接的方式发起文件下载请求
配置web.xml文件:配置web.xml,创建DownloadServlet
后台Servlet实现:设置响应类型及响应头输出流写入文件内容
批量文件下载:

// 批量下载文件
private void downMore(HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.setContentType("application/x-msdownload");
resp.setHeader("Content-Disposition", "attachment;filename=test.zip");

String path = getServletContext().getRealPath("/") + "images/";
String[] filenames = req.getParameterValues("filename");

String str = "";
String rt = "/r/n";

ZipOutputStream zos = new ZipOutputStream(resp.getOutputStream());
for (String filename : filenames) {
str += filename + rt;
File file = new File(path+filename);
zos.putNextEntry(new ZipEntry(filename));
FileInputStream fis = new FileInputStream(file);
byte[] b = new byte[1024];
int n = 0;
while ((n = fis.read(b)) != -1) {
zos.write(b, 0, n);
}
zos.flush();
fis.close();
}
zos.setComment("download success:" + rt + str);
zos.flush();
zos.close();
}
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


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
单文件下载:

// 下载一个文件
private void downOne(HttpServletRequest request, HttpServletResponse response)
throws FileNotFoundException, IOException, ServletException {
// 获取文件下载路径
String path = getServletContext().getRealPath("/") + "images/";
System.out.println("要下载的文件路径地址:" + path);
String filename = request.getParameter("filename");
File file = new File(path + filename);
if (file.exists()) {
// 设置响应类型
response.setContentType("application/x-msdownload");
// 设置头信息(作用:以附件的形式打开我们的下载文件,并且指定了附件的名称,这样下载的时候文件名就是这里设置的文件名称了)
response.setHeader("Content-Dispostion", "attachment;filename=\"" + filename + "\"");
InputStream is = new FileInputStream(file);
ServletOutputStream sos = response.getOutputStream();
byte[] b = new byte[1024];
int n;
while ((n = is.read(b)) != -1) {
sos.write(b, 0, n);
}
// 关闭流释放资源
sos.close();
is.close();

} else {
request.setAttribute("errorResult", "文件不存在,下载失败!");
RequestDispatcher dispatcher = request.getRequestDispatcher("jsp/01.jsp");
dispatcher.forward(request, response);
}
}
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


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

使用SmartUpload实现文件的上传和下载

1.使用该组件可以轻松的实现上传文件类型的限制,也可以轻易的取得文件上传的名称、后缀、大小等。

2.SmartUpload本身也是一个系统提供的jar包,直接将此包放到classpath下即可,也可以拷贝到tomcat_home\lib目录中

使用SmartUpload实现文件的批量上传:

private void uploadFiles(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置上传文件保存路径
String filePath = getServletContext().getRealPath("/")+"images";
System.out.println("上传到的文件路径地址:"+filePath);
File file = new File(filePath);
if(!file.exists()){
file.mkdir();
}
String result = "上传成功!";
SmartUpload su = new SmartUpload();
//初始化对象
su.initialize(getServletConfig(), request, response);
//设置上传文件的大小(10M)
su.setMaxFileSize(1024*1024*10);
//设置上传的所有文件的大小(100M)
su.setTotalMaxFileSize(1024*1024*100);
//设置上传文件的的类型
su.setAllowedFilesList("txt,jpg,gif");
//设置禁止上传文件的类型
try {
su.setDeniedFilesList("rar,jsp,js");
//上传文件
su.upload();
//将上传文件保存在文件夹中(返回的是上传的文件的个数)
int count = su.save(filePath);
System.out.println("上传成功了"+count+"个文件!");
} catch (Exception e) {
result = "上传失败!";
if(e.getMessage().indexOf("1015")!=-1){
result = "上传失败:上传文件类型不正确!";
}else if(e.getMessage().indexOf("1010")!=-1){
result = "上传失败:上传文件的类型不正确!";
}else if(e.getMessage().indexOf("1105")!=-1){
result = "上传失败:上传文件的大小大于允许上传的最大值!";
}else if(e.getMessage().indexOf("1110")!=-1){
result = "上传失败:上传文件的总大小大于允许上传的最大值!";
}
e.printStackTrace();

}

//通过SmartUpload获得上传文件的其他属性
for(int i=0;i<su.getFiles().getCount();i++){
org.lxh.smart.File tempFile = su.getFiles().getFile(i);
System.out.println("----------------------");
System.out.println("上传的文件名:"+tempFile.getFileName());
System.out.println("上传的文件的大小:"+tempFile.getSize());
System.out.println("上传的扩展名:"+tempFile.getFileExt());
System.out.println("上传的文件的全名:"+tempFile.getFilePathName());
System.out.println("----------------------");
}

request.setAttribute("result", result);
request.getRequestDispatcher("jsp/02.jsp").forward(request, response);
}
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


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
使用SmartUpload实现文件的下载(单文件下载):

//下载一个文件
private void downOne(HttpServletRequest request, HttpServletResponse response) {
String filename = request.getParameter("filename");
SmartUpload su = new SmartUpload();

try {
su.initialize(getServletConfig(), request, response);
su.downloadFile("/images/" + filename);

} catch (Exception e) {
e.printStackTrace();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13


1
2
3
4
5
6
7
8
9
10
11
12
13
项目完整代码的Github地址:



顶 0 踩 0
 
 
上一篇常用工具类的积累

下一篇java中volatile关键字---学习笔记

  相关文章推荐


php学习笔记(十)文件的上传与下载

Struts2学习笔记(七)之文件的下载

Java web 中实现简单的文件上传与下载——学习笔记

ThinkPHP学习笔记(十四)上传文件

Struts2学习笔记13:Struts2的文件上传和下载

Struts2.x 学习笔记 之 文件上传和下载

MonoRail学习笔记十五:文件上传

hadoop学习笔记之hdfs的文件上传下载

OA (ssh) 基本实现(poi 生成 Excel , struts2动态下载 mysql数据库文件) 学习笔记(含源代码)

Flask--学习笔记--上传、下载文件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: