java web上传和下载的基础实现笔记

一、上传文件

依赖的jar包:

commons-fileupload-1.3.1.jar

commons-io-2.4.jar

前端页面代码:

<form action="UpFileController" method="post" enctype="multipart/form-data">
	姓名:<input type="text" name="name"><br>
	学号:<input type="text" name="studyid"><br>
	上传文件:<input type="file" name="file"><br>
	<input type="submit" value="提交">
</form>

Servlet代码:

public class UpFileController extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("utf-8");
        String name = null;
        int studyid = 0;

        boolean isHavemultipart = ServletFileUpload.isMultipartContent(request);// 用来获取前端是否设置enctype="multipart/form-data"属性

        if (isHavemultipart) {
            try {
                DiskFileItemFactory factory = new DiskFileItemFactory();
                ServletFileUpload sfu = new ServletFileUpload(factory);
				
                /*****限制上传文件大小的一种方法,如果文件大小超过限制的20480B,则抛出异常****/
                //设置上传文件时的临时缓冲文件大小10KB
                factory.setSizeThreshold(10240);
                //设置临时缓冲文件所在目录
                factory.setRepository(new File("uploadtemp"));
                //对上传的文件的大小做限制 20KB
                sfu.setSizeMax(20480);//单位:字节B
                /**********************************************************************/
				
                List<FileItem> items = sfu.parseRequest(request);// 解析form中的所有请求字段,并保存到item集合中(也就是前台传的name,studyid,和file)
                Iterator<FileItem> iter = items.iterator();// 通过迭代器遍历items中的数据(也可以通过foreach遍历)
                while (iter.hasNext()) {
                    FileItem item = iter.next();
                    // 判断是普通form字段,还是文件字段
                    if (item.isFormField()) {
                        // 如果是普通字段通过如下方式获取
                        String itemName = item.getFieldName();// 获取普通字段的名字
                        if (itemName.equals("name")) {
                            name = item.getString();
                        } else if (itemName.equals("studyid")) {
                            studyid = Integer.parseInt(item.getString());
                        }
                    } else {
                        try {
                            // 如果是文件字段则通过如下方式获取文件名
                            String fileName = item.getName();// 获取文件字段的名字(也就是文件名)	
							
                            /******限制上传文件大小的另一种方法,如果文件大小超过限制的20480B,则抛出异常*********/
                            //获取文件大小,单位B
                            //Long fileSize = item.getSize();
                            //if(fileSize > 20480) {
                            //    System.out.println("上传的文件超过规定的大小!");
                            //    return;
                            //}
                             /**********************************************************************/
                            // 对上传文件的类型做限制
                            String ext = fileName.substring(fileName.indexOf(".") + 1);// 获取文件扩展名							
                            if (!(ext.equals("png") || ext.equals("txt"))) {
                                System.out.println("上传文件类型有误!");
                                return;// 直接终止方法,保证文件不会被上传
                            }
                            // 定义文件上传位置,一般为服务器路径
                            // String filePath = "C:\\Program Files\\Apache Software Foundation\\Tomcat
                            // 7.0\\wtpwebapps\\useJDBCToLogin\\upload";
                            String filePath = request.getSession().getServletContext().getRealPath("upload");
                            File file = new File(filePath, fileName);
							
							

                            item.write(file);// 获取文件内容并上传
                            System.out.println(fileName + "上传成功!");
                        } catch(FileUploadException e){
                            e.printStackTrace();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
			} catch(FileUploadBase.SizeLimitExceededException e){
				//文件超过限制大小异常
				System.out.println("上传的文件超过规定的大小!");
				//e.printStackTrace();
			} catch (FileUploadException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
		System.out.println("name:" + name +",studyid:" + studyid);
	}

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

}

二、下载文件

不需要依赖任何jar包。

前端页面代码:(选择中文文件是为了解决中文乱码问题)

<a href="DownFileController?filename=派森.txt">派森</a>

Servlet部分:

public class DownFileController extends HttpServlet {
	private static final long serialVersionUID = 1L;
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	request.setCharacterEncoding("utf-8");

    	//1、获取客户请求的文件名
    	String filename = request.getParameter("filename");
    	//顺道说一下get请求的编码方式为"ISO-8859-1",所以如果get请求中有中文字符就需要转为utf-8编码,才能正确显示出中文;
    	//同理从servlet向前端发送url时,如果其中有中文参数,也要将其由UTF-8转码为"ISO-8859-1",这里的编码问题亲自检测过谷歌、IE、火狐浏览器均正常
    	//前面说的是get请求,而当post请求时,只要设置request.setCharacterEncoding("utf-8")即可
    	filename = new String(filename.getBytes("ISO-8859-1"),"UTF-8");//解析请求中的中文参数
    	
    	String file = URLEncoder.encode(filename,"utf-8");
    	
    	
    	//2、下载文件需要设置消息头
    	response.addHeader("content-Type", "application/octet-stream");//设置响应的文件类型为二进制文件
		//response.addHeader("content-Disposition", "attachment;filename=" + URLEncoder.encode(file,"utf-8"));
		response.addHeader("content-Disposition", "attachment;filename=" + new String(file.getBytes("utf-8"),"ISO-8859-1"));
		
		//3、输入流:Servlet通过文件的地址,将文件转为输入流读如Servlet中
		InputStream in = getServletContext().getResourceAsStream("/DownResc/" + filename);
		
		//4、输出流:通过输出流将刚才已经转为输入流的文件输出给用户
		ServletOutputStream out = response.getOutputStream();
		
		//5、开始读文件
		byte[] bs = new byte[1024];
		int len = -1;
		while ((len=in.read(bs)) != -1) {
			out.write(bs, 0, len);			
		}
		//6、关闭输入、输出流
		out.close();
		in.close();
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值