好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Java文件上传与文件下载实现方法详解

本文实例讲述了java文件上传与文件下载实现方法。分享给大家供大家参考,具体如下:

java文件上传

数据上传是客户端向服务器端上传数据,客户端向服务器发送的所有请求都属于数据上传。文件上传是数据上传的一种特例,指客户端向服务器上传文件。即将保存在客户端的文件上传一个副本到服务器,并保存在服务器中。

1、上传表单要求

文件上传要求客户端提交特殊的请求——multipart请求,即包含多部分数据的请求。必须将<form/>标签的enctype属性值设为[ multipart/form-data ],enctype表示 encodingtype ,及编码类型 由于客户端上传文件的大小是不确定的,所以http协议规定,文件上传的数据要存放于请求正文中,不能出现在url地址栏内。也就是说,想要上传文件必须提交post请求。 表单中要有 <input type="file" /> 标签 注意: multipart/form-data 请求与普通请求不同

2、下载文件上传jar包并查看官方文档

打开apache官网 http://HdhCmsTestapache.org/ ,选择apache project list中的commons

选择commons中的fileupload项目,并下载jar包和源文件

查看fileupload的工作方式

查看fileupload项目的api

3、使用第三方jar包上传文件

?

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

93

public class registerservlet extends httpservlet {

   private static final long serialversionuid = 1l;

   public registerservlet() {

     super ();

   }

   protected void doget(httpservletrequest request, httpservletresponse response)

     throws servletexception, ioexception {

     response.getwriter().append( "served at: " ).append(request.getcontextpath());

   }

   protected void dopost(httpservletrequest request, httpservletresponse response)

     throws servletexception, ioexception {

     //第一步、判断请求是否为multipart请求

     if (!servletfileupload.ismultipartcontent(request)) {

       throw new runtimeexception( "当前请求只支持文件上传" );

     }

     try {

       //第二步、创建fileitem工厂

       diskfileitemfactory factory = new diskfileitemfactory();

       //设置临时文件存储目录

       string path = this .getservletcontext().getrealpath( "/temp" );

       file temp = new file(path);

       factory.setrepository(temp);

       //单位:字节。本例设置边界值为2mb,超过该值会创建临时文件

       factory.setsizethreshold( 1024 * 1024 * 2 );

       //第三步、创建文件上传核心组件

       servletfileupload upload = new servletfileupload(factory);

       //设置item的头部字符编码,解决中文乱码问题

       upload.setheaderencoding( "utf-8" );

       //设置单个上传文件的最大值为5mb

       upload.setfilesizemax( 1024 * 1024 * 5 );

       //设置一次上传所有文件总和的最大值为10mb(上传多个文件时起作用)

       upload.setfilesizemax( 1024 * 1024 * 10 );

       //第四步、解析请求获取所有的item

       list<fileitem> items = upload.parserequest(request);

       //第五步、遍历item

       for (fileitem item:items) {

         if (item.isformfield()) {

             processformfield(item);

           } else {

             processuploadedfile(item);

           }

       }

     } catch (fileuploadexception e) {

       e.printstacktrace();

     }

   }

   private void processformfield(fileitem item) {

     try {

       string name = item.getfieldname();

       //解决中文乱码问题

       string value = item.getstring( "utf-8" );

       system.out.println(name+ "=" +value);

     } catch (unsupportedencodingexception e) {

       e.printstacktrace();

     }

   }

   private void processuploadedfile(fileitem item) {

     try {

       inputstream inputstream = item.getinputstream();

       string fieldname = item.getfieldname();

       //获取上传文件原始名称

       string filename = item.getname();

       //解决文件同名问题

       filename = system.currenttimemillis()+filename;

       string contenttype = item.getcontenttype();

       boolean isinmemory = item.isinmemory();

       long sizeinbytes = item.getsize();

       string path = this .getservletcontext().getrealpath( "/uploadcontent" );

       //date now = new date();

       calendar now = calendar.getinstance();

       //对上传的文件进行分类管理

       path += "/" +now.get(calendar.year)+ "/" +(now.get(calendar.month)+ 1 )+ "/" +now.get(calendar.day_of_month);

       //若目录不存在,则创建该目录

       file directory = new file(path);

       if (!directory.exists()) {

         directory.mkdirs();

       }

       file descfile = new file(path,filename);

       outputstream outputstream = new fileoutputstream(descfile);

       int length = - 1 ;

       byte [] buffer = new byte [ 1024 ];

       while ((length=inputstream.read(buffer))!=- 1 ) {

         outputstream.write(buffer, 0 , length);

       }

       outputstream.close();

       inputstream.close();

       //删除临时文件

       item.delete();

     } catch (ioexception e) {

       e.printstacktrace();

     }

   }

}

java文件下载

数据下载是客户端从服务器获取数据,服务器向客户端发送的所有响应都属于数据下载。文件下载是数据下载的一种特例,指客户端从服务器下载文件,即将保存在服务器的文件下载一个副本到客户端。通常我们对服务器所发出的请求,大多是文件下载请求,从服务器中下载文本、图片、声音、视频等文件,客户端浏览器对这些文件进行解析后,我们才能看到多媒体信息。

1、超链接下载

浏览器能解析的文件会直接显示,如:pdf、jpg...... 浏览器解析不了的文件会被另存为,如:rar、exe...... 浏览器版本不一样,对文件的解析能力也不同 缺点:下载内容的形式(直接显示/另存为)由浏览器决定,跟服务器无关

2、servlet方式下载

设置响应头部属性content-disposition值为attachment 获取连接服务器源文件的输入流 获取输出流 将输入流中的数据写到输出流中

?

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

public class downloadservlet extends httpservlet {

   private static final long serialversionuid = 1l;

   public downloadservlet() {

     super ();

   }

   protected void doget(httpservletrequest request, httpservletresponse response)

     throws servletexception, ioexception {

     //设置响应的头部属性content-disposition值为attachment

     //使用filename来指定文件名

     string filename = "超跑.png" ;

     byte [] bytes = filename.getbytes( "utf-8" );

     //http协议规定浏览器只能接受iso8859-1类型的字节数据

     filename = new string(bytes, "iso8859-1" );

     response.setheader( "content-disposition" , "attachment;filename=" +filename);

     //获取连接服务器资源文件的输入流

     inputstream is = request.getservletcontext().getresourceasstream( "/resources/bs架构原理图1.png" );

     //获取输出流

     servletoutputstream os = response.getoutputstream();

     //将输入流中的数据写到输出流中

     int length = - 1 ;

     byte [] buffer = new byte [ 1024 ];

     while ((length=is.read(buffer))!=- 1 ) {

       os.write(buffer, 0 ,length);

     }

     os.close();

     is.close();

   }

   protected void dopost(httpservletrequest request, httpservletresponse response)

     throws servletexception, ioexception {

     doget(request, response);

   }

}

希望本文所述对大家java程序设计有所帮助。

原文链接:https://blog.csdn.net/xiaouncle/article/details/80379322

查看更多关于Java文件上传与文件下载实现方法详解的详细内容...

  阅读:22次