一:文件的上传
(1)需要两个jar包,commons-fileupload-1.2.1.jar,commons-io-2.0.jar,点击下载密码g1rz
(2)前期准备
1). 请求方式为 POST: <form action="uploadServlet" method="post" ... >
2). 使用 file 的表单域: <input type="file" name="file"/>
3). 使用 multipart/form-data 的请求编码方式: <form action="uploadServlet" method="post" enctype="multipart/form-data">
(3)获得FileItem对象
> 简单的方式
// Create a factory for disk-based file items
FileItemFactory factory = new DiskFileItemFactory();
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Parse the request
List /* FileItem */ items = upload.parseRequest(request);
> 复杂的方式: 可以为文件的上传加入一些限制条件和其他的属性
// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置内存中最多可以存放的上传文件的大小, 若超出则把文件写到一个临时文件夹中. 以 byte 为单位
factory.setSizeThreshold(yourMaxMemorySize);
//设置那个临时文件夹
factory.setRepository(yourTempDirectory);
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
//设置上传文件的总的大小. 也可以设置单个文件的大小.
upload.setSizeMax(yourMaxRequestSize);
// Parse the request
List /* FileItem */ items = upload.parseRequest(request);
if(fm.isFormField()) {
String name =fm.getFieldName();
String value = fm.getString();
System.out.println(name+"11:"+value);
//若是文件域,则把文件保存到本地硬盘中
}else {
String fieldName = fm.getFieldName();
String fileName = fm.getName();
String contentType = fm.getContentType();
long sizeInbytes = fm.getSize();
System.out.println("fieldName:"+fieldName);
System.out.println("fileName:"+fileName);
System.out.println("contentType:"+contentType);
System.out.println("sizeInbytes:"+sizeInbytes);
InputStream is = fm.getInputStream();
byte[] buffer = new byte[1024];
int len = 0;
System.out.println("E:\\MyTemp\\"+fileName);
OutputStream out = new FileOutputStream("e:\\MyTemp\\"+fileName);
while((len=is.read(buffer)) !=-1 ) {
out.write(buffer, 0, len);
}
out.flush();
out.close();
is.close();
}
二:文件的下载
(1). 设置 contentType 响应头: 设置响应的类型是什么 ? 通知浏览器是个下载的文件
response.setContentType("application/x-msdownload");
(2) 设置 Content-Disposition 响应头: 通知浏览器不再有浏览器来自行处理(或打开)要下载的文件, 而由用户手工完成
response.setHeader("Content-Disposition", "attachment;filename=abc.txt");
(3)具体的文件: 可以调用 response.getOutputStream 的方式, 以 IO 流的方式发送给客户端.
response.setContentType("application/x-msdownload");
(2) 设置 Content-Disposition 响应头: 通知浏览器不再有浏览器来自行处理(或打开)要下载的文件, 而由用户手工完成
response.setHeader("Content-Disposition", "attachment;filename=abc.txt");
(3)具体的文件: 可以调用 response.getOutputStream 的方式, 以 IO 流的方式发送给客户端.
request.setCharacterEncoding("utf-8");
String fileName = request.getParameter("fileName");
String filePath =request.getParameter("filePath");
response.setContentType("application/x-msdownload");
response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(fileName, "UTF-8"));
InputStream in = new FileInputStream(filePath);
OutputStream out = response.getOutputStream();
int len=0;
byte[] b = new byte[1024];
while((len=in.read(b))!= -1) {
out.write(b, 0, len);
}
out.close();