1 导入jar包
2 文件上传
<form action="uploadServlet" method="post" encType="multipart/form-data">
<input type="file" name="f"><br>
<input type="text" name="username"><br>
<input type="submit" value="上传">
</form>
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);
try {
List<FileItem> items = fileUpload.parseRequest(request);
for (FileItem fileItem : items) {
if(!fileItem.isFormField()){
String name = fileItem.getName();
System.out.println(name+"-----getName");
name = name.substring(name.lastIndexOf("\\")+1);
System.out.println(name);
FileOutputStream fos = new FileOutputStream("d:/upload/"
+ name);
IOUtils.copy(fileItem.getInputStream(), fos);
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
首先文件上传的中有三个核心类,分别是DiskFileIItemFactory 和 servletFileUpload 还有 FileItem ,前面的两个核心类都是写死的,
然后重点说一下,调用ServletFileUpload的parseRequest()方法,得到的这个集合,这个集合中的泛型就是表单项。
类似与上面的表单就有两个表单项,那么我们遍历这个集合,然后判断是否是文件上传的表单项。
通过那个if的条件进行判断,当里面的方法返回值是true的时候,那么就代表这个表单项不是文件上传的表单项,
所以我在判断的时候,如果返回值为!那么这个就是我的上传表单项,fileItem有个方法 getName,这个方法根据浏览器的不同,
有时候上传的值也是不同的。IE浏览器上传文件之后就是这个文件的路径名+文件本身的名,例如a.txt,上传就是文件的路径+a.txt,
但是有的浏览器上传文件的getname就是文件本身的名称,例如就是a.txt,没有文件的路径。
所以为了保险起见,我们给name进行一下处理,进行一下切割,找到最后一个\ (需要进行转义一下,转义之后是\\),然后我创建一个文件输出流,然后调用IoUtils.copy ,
传入文件输入流,和文件输出流,其实这个方法的实现底层就是io流读写之间的转换。
String name = item.getName(); // 上传文件名称
System.out.println(name);
name = name.substring(name.lastIndexOf("\\") + 1);
System.out.println("上传组件:" + name);
String msg = item.getString();
System.out.println(msg);
//获取上传文件内容,完成文件 上传操作
InputStream is = item.getInputStream();
byte[] b = new byte[1024];
int len = -1;
FileOutputStream fos = new FileOutputStream("d:/upload/"
+ name);
while ((len = is.read(b)) != -1) {
fos.write(b, 0, len);
}
fos.close();
is.close();
IOUtils.copy(item.getInputStream(), fos);
其实我们在实际的项目中,我们文件的上传路径不能使用硬编码的方式,我们一般在webRoot下创建一个上传的文件夹,temp,
请注意,最好不要放在web-inf 和 mat-inf中。然后我创建DiskFileItemFactory使用另一构构造方法。
File file = new File(this.getServletContext().getRealPath("/temp"));
// 获取temp目录部署到tomcat后的绝对磁盘路径
DiskFileItemFactory factory = new DiskFileItemFactory(1024 * 100, file);
// 使用默认的.
构造方法中的参数一个是上传文件的最大的值,另一个是上传文件的临时存储目录,首先,当我们使用无参数的构造的时候,
上传文件是默认存储在内存中的,类似与小的文本文档存储在内存中是可以的,
但是如果文件过大,那么直接存储在内存中效率低下,那么我们需要构建一个临时的文件存储目录。
下面的这张图片说一下fileItem的一些常用api。
下面说一下文件下载
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1.得到要下载 的文件名称
String filename = request.getParameter("filename");
filename = new String(filename.getBytes("iso8859-1"), "utf-8");
// 解决中文乱码
// 2.在d:/upload目录下查找这个文件是否存在
File file = new File("d:/upload/" + filename);
if (file.exists()) {
// /文件存在,完成下载
// 下载注意事项1--设置下载文件的mimeType
String mimeType = this.getServletContext().getMimeType(filename);
response.setContentType(mimeType);
String agent = request.getHeader("user-agent");
if (agent.contains("MSIE")) {
// IE浏览器
filename = URLEncoder.encode(filename, "utf-8");
} else if (agent.contains("Firefox")) {
// 火狐浏览器
BASE64Encoder base64Encoder = new BASE64Encoder();
filename = "=?utf-8?B?"
+ base64Encoder.encode(filename.getBytes("utf-8"))
+ "?=";
} else {
// 其它浏览器
filename = URLEncoder.encode(filename, "utf-8");
}
// 下载注意事项2--永远是下载
response.setHeader("content-disposition", "attachment;filename="
+ filename);
FileInputStream fis = new FileInputStream(file); // 读取要下载文件的内容
OutputStream os = response.getOutputStream();
// 将要下载的文件内容通过输出流写回到浏览器端.
int len = -1;
byte[] b = new byte[1024 * 100];
while ((len = fis.read(b)) != -1) {
os.write(b, 0, len);
os.flush();
}
os.close();
fis.close();
} else {
throw new RuntimeException("下载资源不存在.");
}
}
<body>
<a href='${pageContext.request.contextPath}/download?filename=a.bmp'>a.bmp</a><br>
<a href='${pageContext.request.contextPath}/download?filename=a.doc'>a.doc</a><br>
<a href='${pageContext.request.contextPath}/download?filename=a.txt'>a.txt</a><br>
<a href='${pageContext.request.contextPath}/download?filename=天空.mp3'>天空.mp3
</a><br>
</body>