好得很程序员自学网

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

java实现文件上传和下载

本文实例为大家分享了java实现文件上传和下载的具体代码,供大家参考,具体内容如下

文件的上传

upload:文件上传

客户端通过表单的文件域file  把客户端的文件 上传保存到服务器的硬盘上

页面

首先对上传的表单有以下要求:

必须有文件域:input type=file 表单提交方式:method=post 表单的 enctype=multipart/form-data

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

< form method = "post" action = "/user/regist" enctype = "multipart/form-data" >

         < table style = "border: chartreuse;solid:2px" >

             < tr >

                 < th >用户名</ th >

                 < td >< input type = "text" name = "username" ></ td >

             </ tr >

             < tr >

                 < th >密码</ th >

                 < td >< input type = "password" name = "password" ></ td >

             </ tr >

             < tr >

                 < th >用户头像</ th >

                 < td >< input type = "file" name = "photo" > </ td >

             </ tr >

             < tr >

                 < td colspan = "2" >< input type = "submit" value = "提交" ></ td >

             </ tr >

         </ table >

</ form >

Servlet

1)首先要导入以下两个jar包,通过commons-fileupload实现文件上传

2)创建一个工厂对象DiskFileItemFactory,在创建一个多部件表单解析器ServletFileUpload,构造方法传入工厂对象

3)解析器解析请求对象,获得一个list集合,其中list集合存储的是一个一个的fileItem对象,一个fileItem对应一个组件,也就是一个<input>

4) 遍历集合用isFormField()方法判断是否为普通组件,然后着重处理文件域组件

5)获取文件名,并用getRealPath方法获取服务器上传文件所在路径,创建新文件夹

6)获取输入流和创建输出流,进行文件的读写

?

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

@WebServlet (value = "/user/regist" )

public class UploadServlet extends HttpServlet {

     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

         //创建一个工厂对象

         DiskFileItemFactory factory = new DiskFileItemFactory();

         //创建一个多部件解析器对象

         ServletFileUpload fileUpload = new ServletFileUpload(factory);

         User user = new User();

         FileOutputStream out= null ;

         try {

             //用解析器对象解析请求,返回一个FileItem类型的集合

             List<FileItem> list = fileUpload.parseRequest(req);

             for (FileItem fileItem : list) {

                 /**

                  * fileItem.getFieldName());:::获取组件的name值

                  * fileItem.getName());::::获取文件域的文件名

                  * fileItem.getSize());::::获取数据的字节个数

                  * fileItem.getString());::::获取数据的字符串

                  * fileItem.isFormField());:::判断是否为普通组件

                  */

                 //判断部件是否为普通组件

                 if (fileItem.isFormField()) { //普通组件

                     //获取组件名字也就是name的值

                     String fieldName = fileItem.getFieldName();

                     //获取组件的值也就是value的值

                     String value = fileItem.getString( "utf-8" );

                     if ( "username" .equals(fieldName)) { //设置实体类的属性

                         user.setUsername(value);

                     } else if ( "password" .equals(fieldName)) {

                         user.setPassword(value);

                     }

                 } else { // 文件域

                     //获取文件名

                     String fielName = fileItem.getName();

                     //输入流来读数据

                     InputStream in = fileItem.getInputStream();

                     //设置文件写出的路径,并用随机码来保证图片可以重复

                     String path=req.getServletContext().getRealPath( "/imgs/" + UUID.randomUUID()+fielName);

                     System.out.println( "文件路径为:" +path);

                     File file = new File(path);

                      out = new FileOutputStream(file);

                      //利用commons-io-1.4.jar的IOUtils的copy方法直接实现文件的复制

                     IOUtils.copy(in,out);

                     user.setPhoto(file.getName());

                 }

             }

         } catch (Exception e) {

             e.printStackTrace();

         } finally {

             if (out!= null ){

                 out.close();

             }

         }

         req.getSession().setAttribute( "user" ,user);

         req.getRequestDispatcher( "/sucess.jsp" ).forward(req,resp);

     }

 

}

文件的下载

页面

只需一个超链接,传需要下载的文件名,或者直接输入路径在浏览器

例: <a  href="<c:url value='/file/download?fileName=14.jpg'/>" >狗狗1</a><br/>

Servlet

1)接收参数,获取文件名

2)获取imgs的路径,也就是存储文件的文件夹的路径,然后创建文件,传入该路径和文件名

3)创建输入流读取文件

4)设置响应头,首先根据文件名字获取文件的大类型,设置响应头Content-Type指定响应的类型;设置响应头Content-Disposition,指定文件以附件形式保存到本地磁盘

5)用响应获取输出流,读出文件到客户端

?

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

@WebServlet ( "/user/download" )

public class DownloadServlet extends HttpServlet {

     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

         request.setCharacterEncoding( "UTF-8" );

         //获取要下载的文件名

         String fileName = request.getParameter( "fileName" );

         System.out.println(fileName);

         //获取服务器中存储图片的文件夹的路径

         String path1 = request.getServletContext().getRealPath( "/imgs" );

         String path=path1+ "/" +fileName;

         File file = new File(path);

         //创建输入流读文件

         FileInputStream in = new FileInputStream(file);

         //通过文件名字获取文件的大类型

         String type = request.getServletContext().getMimeType(fileName);

         //设置响应头ContentType指定响应内容的类型

         response.setHeader( "Content-type" ,type);

         //设置响应头Content-Disposition 指定以附件形式保存响应的信息

         response.setHeader( "Content-Disposition" , "attachment;filename=" +(URLEncoder.encode(fileName, "utf-8" )));

         ServletOutputStream out = response.getOutputStream();

         //实现文件的读写

         IOUtils.copy(in,out);

         if (in!= null ){

         in.close();

         }

     }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

原文链接:https://blog.csdn.net/weixin_45943192/article/details/120834578

查看更多关于java实现文件上传和下载的详细内容...

  阅读:15次