一、笔记
2.
3. 文件上传步骤:
3.1 一些方法
3.2
文件下载:
1.
1.1
二、撸代码
文件上传代码:
servlet
package cn.lixuquan.fileUPload;
/**
* 需求:
* 学习文件上传
*/
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
* Servlet implementation class FileUpLoad
*/
@WebServlet("/FileUpLoad")
public class FileUpLoad extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//响应中文乱码问题
response.setContentType("text/html;charset=utf-8");
//1.创建文件上传工厂对象
DiskFileItemFactory factory = new DiskFileItemFactory();
//1.1通过工厂对象设置临时文件
File f = new File("d:\\Temp");
if(!f.exists())
{
f.mkdirs();
}
factory.setRepository(f);
factory.setSizeThreshold(1024*1024);
//2.创建解析器对象
ServletFileUpload fileUpload = new ServletFileUpload(factory);
//2.1设置字符编码
fileUpload.setHeaderEncoding("utf-8"); //处理上传普通字段,文件名称的中文乱码问题
//3.解析请求对象
try {
List<FileItem> fileItems = fileUpload.parseRequest(request);
//开始遍历这个表单项
for(FileItem fileitem: fileItems)
{
boolean flag = fileitem.isFormField();
if(flag)
{
//普通表单项
String name = fileitem.getFieldName();
if("username".equals(name))
{
if(!fileitem.getString().equals(""))
{
String value = fileitem.getString("utf-8");
response.getWriter().print("上传者:"+value+"<br>");
}
}
}
else
{
//文件上传的表单项
String filename = fileitem.getName();
//处理文件名称包含路径的问题
if(filename != null && !filename.equals(""))
{
response.getWriter().print("上传的文件名称是:"+filename+"<br>");
filename = filename.substring(filename.lastIndexOf("\\")+1);
//处理上传文件同名的问题
filename = UUID.randomUUID()+"_"+filename;
//服务器端 创建同名的文件
String webPath = "/upload/";
//把文件名称和服务端的文件组合在一起
String filePath = getServletContext().getRealPath(webPath+filename);
//创建文件夹
File file = new File(filePath);
file.getParentFile().mkdirs();
file.createNewFile();
//获取文件的字节输入流
InputStream is = fileitem.getInputStream();
//获取一个输出流
FileOutputStream os = new FileOutputStream(file);
int len = 0;
byte[] buffer = new byte[1024];
while((len=is.read(buffer)) > 0)
{
os.write(buffer, 0, len);
}
//关闭流
os.close();
is.close();
//删除临时文件
fileitem.delete();
response.getWriter().print("文件上传成功"+"<br>");
}
}
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form action="/servletPractice/FileUpLoad" method="post" enctype="multipart/form-data">
学 号:<input type="text" name="username" /><br>
密 码:<input type="password" name="password"/><br>
文件上传 :<input type="file" name="file" /><br>
<input type="submit" value="提交">
</form>
</body>
</html>
注意: 表单里必须加enctype=“multipart/form-data”,不然上传的只是文件名,没有内容。
文件下载代码
servlet
package cn.lixuquan.fileUPload;
/**
* 需求:文件下载
*/
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class DownloadServlet
*/
@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//1.处理响应中文乱码问题
response.setContentType("text/html;charset=utf-8");
//2.获取下载的文件名称,由于下载和上传的fileupload的jar包没有一毛钱关系,所以使用request的一些相关方法
String filename = request.getParameter("filename");
//处理get请求的中文乱码问题
filename = new String(filename.getBytes("iso-8859-1"),"utf-8");
//3.获取文件的mime类型(这里你可以简单的理解为文件的后缀名)
String fileType = getServletContext().getMimeType(filename);
String name=DownUtils.filenameEncoding(filename, request);
//4.设置两个头
response.addHeader("Content-Type",fileType);
response.addHeader("Content-Disposition", "attachment;filename="+name);
//5.文件的下载
String folder = "/download/";
//5.1获取文件的字节输入流
InputStream is = getServletContext().getResourceAsStream(folder+filename);
//5.2获取文件的字节输出流
OutputStream os = response.getOutputStream();
int len = 0;
byte[] buffer = new byte[1024];
while((len=is.read(buffer)) != -1)
{
os.write(buffer, 0, len);
}
//关闭流
os.close();
is.close();
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
jsp代码:
<%@page import="java.net.URLEncoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件下载</title>
</head>
<body>
<a href="downloadServlet?filename=1.jpg">文件下载</a>
<br>
<a href="downloadServlet?filename美女.jpg">文件下载</a>
</body>
</html>
DownUtil代码
package com.zch.upload;
import sun.misc.*;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import javax.servlet.http.HttpServletRequest;
public class DownUtils {
public static String filenameEncoding(String filename, HttpServletRequest request) throws UnsupportedEncodingException {
// 获得请求头中的User-Agent
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");
}
return filename;
}
}
三、分享与交流
最后有兴趣一起交流的,可以关注我的公众号:这里你能够学到很实用的技巧,不是常用的我不说,公众号回复提取码即可获取以下学习资料啦啦啦啦,喜欢就拿去吧!!
(链接时常会失效,若出现此类情况,可以加我微信:17722328325(加时请备注:学习资料))
-
Java web从入门到精通电子书
-
Python机器学习电子书
-
Python400集(北京尚学堂)
-
JavaScript项目案例、经典面试题
-
Java300集(入门、精通)
-
Java后端培训机构录集(同事培训内部提供)
-
java重要知识pdf文档(价值连城呀呀,不收藏你会后悔的)