Servlet上传与下载

一、使用Servlet响应给用户弹出下载框

servlet代码

//1、通过文件流加载图片
		//获取图片的绝对路径
		String realPath = request.getServletContext().getRealPath("img/2.jpg");
		FileInputStream in = new FileInputStream(realPath);
		
		//2.设置一个提供用户下载应答头		不设置下载应答头,则直接在页面显示图片
		//filename 呈现给用户图片的名字
		response.setHeader("Content-Disposition","attachment; filename=2.jpg");
		
		//3.通过流给用户输出图片
		ServletOutputStream out = response.getOutputStream();
		int len = 0;
		byte flush[] = new byte[1024*10];
		while((len = in.read(flush)) != -1){
			out.write(flush,0,len);
		}
		in.close();

二、使用servlet让用户上传文件到服务器并进行接收

注意:这里的jsp文件都需要使用multipart/form-data + post的方式请求数据,方法才有效,否则无法上传

(1)servlet获取数据应通过流获取数据 request.getInputStream()
servlet代码

//通过流获取数据
		ServletInputStream in = request.getInputStream();
		FileOutputStream out = new FileOutputStream("d:/123.txt");
		int len = 0;
		byte flush[] = new byte[1024*10];
		while( (len = in.read(flush)) != -1) {
			out.write(flush, 0, len);
		}
		out.flush();
		out.close();

jsp代码(剩余的两种方法jsp写法都和这个差不多)

<body>
	<form action="up.do" method="post" enctype="multipart/form-data">
		用户名:<input type="text" name="username"><br>
		上传文件:<input type="file" name="myfile"><br>
		<button>提交</button>
	</form>
</body>

(2)web3.0之后,servlet提供了一套方便解析multipart的数据的解决方案

注意:该写法需要在web注解下加多一句
在这里插入图片描述
或在web.xml文件中写明
在这里插入图片描述
否则无法生效

servlet代码

		Part part2 = request.getPart("myfile");
		System.out.println(request.getParameter("myfile"));//获取用户输入的数据
		System.out.println(part2.getName());//获取自己设置name的值
		//System.out.println(part2.getSubmittedFileName());//web3.1才有的方法 获取提交的名字
		System.out.println(part2.getSize());	//获取提交属性的大小
		//通过流进行获取
		InputStream in = part2.getInputStream();
		FileOutputStream out = new FileOutputStream("d:/321.jpg");
		int len = 0;
		byte flush[] = new byte[1024*10];
		while( (len = in.read(flush)) != -1) {
			out.write(flush, 0, len);
		}
		out.flush();
		out.close();

(3)使用别人写好的代码

(该方法比较方便,需要的话可以从apache.org官网中在最下方点击commons,下载对应的jar包和代码。以下代码可供大部分情况使用,可根据实际需要进行修改,使用前需要导入对应的jar包)

servlet代码

	    String tempDirectory = "d:/tmp/";    //要在最后加上斜杠:temp/  存放的临时目录
		String fileDirectory="d:/afile/";   //文件最终上传目录	两个目录都需要自己创建,servlet不会进行创建		
		try {
			int sizeThreshold = 1024 * 64;  //写满该大小的缓存后,存入硬盘中。
			File repositoryFile = new File(tempDirectory);
	
			FileItemFactory factory = new DiskFileItemFactory(sizeThreshold, repositoryFile);
			ServletFileUpload upload = new ServletFileUpload(factory); //表示一次上传的内容设置的对象
			upload.setSizeMax(500 * 1024 * 1024); // 每个文件不能超过500M
            upload.setHeaderEncoding("utf-8"); // 设置字符集
			List items = upload.parseRequest(request);   //这里开始执行上传

			Iterator iter = items.iterator();
			while (iter.hasNext()) {
				FileItem item = (FileItem) iter.next();   //FileItem就是表示一个表单域。 part
				
				if(item.isFormField()){ //isFormField方法用于判断FileItem是否代表一个普通表单域(即非file表单域)
					System.out.println("***"+item.getFieldName());	  //返回表单域的名字
					System.out.println("***"+item.getString("utf-8"));	 //返回表单域的值
				}else {
					String fieldName = item.getFieldName();  //获取表单域name属性的值
					String fileName = item.getName();     //返回该文件在客户机上的文件名。e.g: e:\dianying\\video\1.wmv
					System.out.println("*****"+fieldName);
					System.out.println("*****"+new String(fileName.getBytes(),"utf-8")); //上面设置了字符集,这里就可以不用这么写
					String fileType = fileName.substring(fileName.lastIndexOf("."));
					File uploadedFile = new File(fileDirectory+new Date().getTime()+fileType);
					item.write(uploadedFile);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

对应上面代码的jar包:(可自行搜索下载使用)
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值