文件上传与下载

一、文件上传

依赖jar包:

comments-fileupload.jar comments-io.jar

1、form表单属性enctype="multipart/form-data" method=“post”;

2、请求编码、响应编码设置;

3、解析request对象3步骤

创建工厂类:FileItemFactory factory=DisFileItemFactory();

创建解析器:ServletFileUpload upload = new ServletFileUpload(factory);

使用解析器解析request对象: List<FileItem> items = upload.parseRequest(request);

4、限制元素(置于解析器解析之前)

①upload.setFileSizeMax(1024*n); 限制所有文件上传的大小

②upload.setSizeMax(1024*n); 限制单个文件上传的大小

③upload.setHeaderEncoding("utf-8"); 设置上传的中文格式

5、FileItem对象相关方法

①String itemName = item.getFieldName() ; 获取表单项的name值

②boolean isFormField() ; 判断是否是普通表单字段(true/false)-- 即普通字段text等与文件file的区别

③String getString("编码设置") ; 获取字段内容,普通字段--value值 文件字段--文件内容

④String getContextType():获取上传文件类型 text/image,如果是普通字段,则返回null 也可以通过文件名字符串中后缀来实现上传文件类型限制;

⑥long getSize(1024*n): 获取字段内容大小,单位字节byte

⑦InputStream getInputStream():获取文件内容的输入流,如果是普通字段,则返回value的输入值

6、获取表单数据(文字、文件...)

①定义接收变量

②迭代器/for循环变量item取值

items用法: items.next()返回boolean

whie(items.next()){

     FileItem  item  =  items.next();
     String itemName = item.getFieldName();//获取name
     var var = -1/null/...
     if(item.isFormField()){
         if(equals判断name){
             var = item.getString("utf-8");//接受符合name的value
         }else if(...){
             ...
         }eles{
            其他字段
         }
     }else{
         String fileName = item.getName();获取文件名
         文件相关操作
     }
 }

7、文件相关操作

(1)获取路径字符串
①String path = "xxxx";  //静态指定路径
②String path = request.getSession().getServletContext().getRealPath("upload")//动态获取tomcat下项目路径
③File dir = new File("路径+项目名("d:/upload")");//自行创建目录
if(!dir.exists()){
    dir.mkdirs(); //不存在则创建
}
(2)获取文件名(包含后缀)
String fileName = item.getName();
处理文件重名导致覆盖问题----UUID类
UUID uuid = UUID.randomUUID();
String uuidName = uuid.toString()+fileName.substring(fileName.lastIndexOf("."));
③存储文件方式(路径位置与文件名字)
File file = new File(路径,文件名)  路径:path/dir  文件名:fileName/uuidName;
④文件上传(item实际上就是获取的文件内容)
item.write(file);

简单示例:

<form action="uploadServlet" enctype="multipart/form-data" method="post">
		文件编号:<input type="text" name="fno"/>
		文件:<input type="file" name="file"/>
</form>
    //设置编码格式        
    request.setCharacterEncoding("utf-8");
    response.setCharacterEncoding("utf-8");
    response.setContentType("text/html; charset=UTF-8");

	Iterator<FileItem> iter = items.iterator();// 通过迭代器便利List元素
				while (iter.hasNext()) {
					FileItem item = iter.next();
					if (item.isFormField()) {
						// type=表单属性
						String itemName = item.getFieldName();
						String fno = "";
						if (itemName.equals("fno")) {
							fno = item.getString();//获取name为fno的属性值
							System.out.println("fno属性值:" + fno);
						} else {
							System.out.println("其他属性字段...");
						}

					} else {
						// type=file
						System.out.println("xxx");
						String fileName = item.getName();// 获取文件名
						File dir = new File("D:/testDir");// 文件存储目录,无则创建
						if (!(dir.exists())) {
							dir.mkdirs();
						}
						File file = new File(dir, fileName);
						item.write(file);

					}

				}
			} catch (FileUploadException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}
		} else {
			// 不是文件表单
			System.out.println("非文件表单...");
		}

二、文件下载

依赖jar包: 无 

1、通过<a href=""></a>或者form表单进行文件下载----获取下载文件名

	<form action="downloadServlet" method="post">
		文件名:<input type="text" name="fname"/><br>
		<input type="submit" value="下载"/><br>
	</form>
	<a href="downloadServlet?fname=1234.docx">下载文件名为1234.docx的文件</a>

2、downloadServlet中配置响应信息头

response.addHeader("content-Type", "application/octet-stream");
response.addHeader("content-Disposition", "attachment;filename=" + fname);

不同浏览器下载文件名乱码问题:

不过本人测试得,即使设置为:URLEncoder.encode(fname, "utf-8"),在火狐上下载也不会乱码。

String agent = request.getHeader("User-Agent");
		if (agent.toLowerCase().indexOf("firefox") != -1) {
			System.out.println("火狐设置");
			response.addHeader("content-Disposition", "attachment;filename==?UTF-8?B?"
					+ new String(Base64.encodeBase64(fname.getBytes("utf-8")) + "?="));
		} else {
			System.out.println("非火狐设置:" + agent);
			response.addHeader("content-Disposition", "attachment;filename=" + URLEncoder.encode(fname, "utf-8"));
		}

3、获取下载文件的路径

String path = "D:/testDir/" + fname;

4、通过IO操作将文件转换为输入输出流

    InputStream in = new FileInputStream(path);//将对应目录文件转换为输入流
/*
  * 文件在项目目录中
  *  InputStream in = getServletContext().getResourceAsStream("/ServletDir/" + fname);   
*/
  
	ServletOutputStream out = response.getOutputStream();
		byte[] chs = new byte[100];
		int len = -1;
		while ((len = in.read(chs)) != -1) {
			out.write(chs, 0, len);
		}

    //关闭流
		out.close();
		in.close();

简单示例:

	<form action="downloadServlet" method="post">
		文件名:<input type="text" name="fname"/><br>
		<input type="submit" value="下载"/><br>
	</form>
	<a href="downloadServlet?fname=1234.docx">下载文件名为1234.docx的文件</a>
		// 响应头
		String fname = request.getParameter("fname");
		response.addHeader("content-Type", "application/octet-stream");
		// response.addHeader("content-Disposition", "attachment;filename=" + fname);
		String agent = request.getHeader("User-Agent");
		if (agent.toLowerCase().indexOf("firefox") != -1) {
			System.out.println("火狐设置");
			response.addHeader("content-Disposition", "attachment;filename==?UTF-8?B?"
					+ new String(Base64.encodeBase64(file.getFname().getBytes("utf-8")) + "?="));
		} else {
			System.out.println("非火狐设置:" + agent);
			response.addHeader("content-Disposition", "attachment;filename=" + URLEncoder.encode(fname, "utf-8"));
		}

		String path = "D:/testDir/" + fname;
		System.out.println(path);
		InputStream in = new FileInputStream(path);
		// InputStream in = getServletContext().getResourceAsStream("/ServletDir/"+fname);
		// OutputStream out = new FileOutputStream();
		ServletOutputStream out = response.getOutputStream();
		byte[] chs = new byte[100];
		int len = -1;
		while ((len = in.read(chs)) != -1) {
			out.write(chs, 0, len);
		}
		out.close();
		in.close();

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值