1.思维导图

2.代码部分
文件上传页面代码
<form action="${pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data">
描述:<input type="text" name="desc"><br>
<input type="file" name="file"/><br>
<button type="submit">上传</button>
</form>
文件上传后台代码
//1,创建磁盘文件项工厂对象
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
//2,创建核心解析对象
ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
try {
//3,解析上传请求,获取文件项(包含上传的文件、描述文本)
List<FileItem> fileItems = servletFileUpload.parseRequest(request);
for (FileItem fileItem : fileItems) {
//判断fileItem是否是一个上传文件
if (fileItem.isFormField()) {
//是描述文本,打印文本
String desc = fileItem.getString();
System.out.println(desc);
} else {
//是上传的文件
//获取到了上传的文件的输入流,包含了上传的文件的数据
InputStream inputStream = fileItem.getInputStream();
//转换成高效输入流
BufferedInputStream bis = new BufferedInputStream(inputStream);
//获取高效输出流
String dirPath = request.getRealPath("upload");
File dirFile = new File(dirPath);
if (!dirFile.exists()) {
//手动创建upload文件夹
dirFile.mkdir();
}
String path = dirPath + File.separator + fileItem.getName();
System.out.println(path);
FileOutputStream fos = new FileOutputStream(path);
BufferedOutputStream bos = new BufferedOutputStream(fos);
byte[] bys = new byte[8192];
int len = -1;
while ((len = bis.read(bys)) != -1) {
bos.write(bys,0,len);
}
bis.close();
bos.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
文件名乱码问题解决
//1,创建磁盘文件项工厂对象
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
//2,创建核心解析对象
ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
//解决文件名称中文乱码问题
servletFileUpload.setHeaderEncoding("utf-8");
try {
//3,解析上传请求,获取文件项(包含上传的文件、描述文本)
List<FileItem> fileItems = servletFileUpload.parseRequest(request);
for (FileItem fileItem : fileItems) {
//判断fileItem是否是一个上传文件
if (fileItem.isFormField()) {
//是描述文本,打印文本
String fieldName = fileItem.getFieldName();
System.out.println(fieldName);
String desc = fileItem.getString("utf-8");
System.out.println(desc);
} else {
//是上传的文件
//获取到了上传的文件的输入流,包含了上传的文件的数据
InputStream inputStream = fileItem.getInputStream();
//转换成高效输入流
BufferedInputStream bis = new BufferedInputStream(inputStream);
//获取高效输出流
String dirPath = request.getRealPath("upload");
File dirFile = new File(dirPath);
if (!dirFile.exists()) {
//手动创建upload文件夹
dirFile.mkdir();
}
//文件名称 = 当前时间毫秒值 + 文件名称
String path = dirPath + File.separator + System.currentTimeMillis() + "-" + fileItem.getName();
System.out.println(path);
FileOutputStream fos = new FileOutputStream(path);
BufferedOutputStream bos = new BufferedOutputStream(fos);
byte[] bys = new byte[8192];
int len = -1;
while ((len = bis.read(bys)) != -1) {
bos.write(bys,0,len);
}
bis.close();
bos.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
文件上传结合数据库后台代码
@Override
public void addFile(MyFile file) throws Exception {
new QueryRunner(JDBCUtils.getDataSource())
.update("insert into tb_document(fileName,filePath,description) values(?,?,?)",
file.getFileName(),
file.getFilePath(),
file.getDesc());
}
@Override
public void addFile(MyFile myFile) throws Exception {
FileDao userDao = new FileDaoImpl();
userDao.addFile(myFile);
}
//上传成功之后,把文件信息(id、文件名称、文件路径、描述)保存到数据库
FileService userService = new FileServiceImpl();
MyFile myFile = new MyFile();
myFile.setFileName(fileName);
// “/day66/upload/美女1.jpg” 绝对路径
myFile.setFilePath(request.getContextPath() + File.separator + "upload" + File.separator + fileName);
myFile.setDesc(desc);
System.out.println(myFile);
userService.addFile(myFile);
文件上传结合数据库页面代码
@Override
public List<MyFile> selectFileList() throws Exception {
return new QueryRunner(JDBCUtils.getDataSource())
.query("select * from tb_document",
new BeanListHandler<MyFile>(MyFile.class));
}
@Override
public List<MyFile> selectFileList() throws Exception {
FileDao userDao = new FileDaoImpl();
return userDao.selectFileList();
}
//获取上传文件列表
FileService fileService = new FileServiceImpl();
try {
List<MyFile> fileList = fileService.selectFileList();
request.setAttribute("fileList",fileList);
//跳转到fileList.jsp
request.getRequestDispatcher("/fileList.jsp").forward(request,response);
} catch (Exception e) {
e.printStackTrace();
}
文件下载基本功能
//获取下载文件名称
String fileName = request.getParameter("fileName");
System.out.println(fileName);
//1,设置媒体类型 : 告诉浏览器下载的文件的类型
//获取下载文件的媒体类型
String mimeType = request.getServletContext().getMimeType(fileName);
System.out.println(mimeType);
response.setContentType(mimeType);
//2,设置下载窗口,通过操作"Content-Disposition"
response.setHeader("Content-Disposition","attachement;filename="+fileName);
//3,开始io读写(完成下载功能)
//服务器中的 1588737734261-美女2.jpg
String path = request.getRealPath("upload") + File.separator + fileName;
System.out.println(path);
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(path));
ServletOutputStream outputStream = response.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(outputStream);
byte[] bys = new byte[8192];
int len = -1;
while ((len = bis.read(bys)) != -1) {
bos.write(bys,0,len);
}
bis.close();
bos.close();
下载文件中文乱码
- 不同浏览器对文件名称的编码方式不同,所以需要区分不同的浏览器
//获取下载文件名称
String fileName = request.getParameter("fileName");
System.out.println(fileName);
//1,设置媒体类型 : 告诉浏览器下载的文件的类型
//获取下载文件的媒体类型
String mimeType = request.getServletContext().getMimeType(fileName);
System.out.println(mimeType);
response.setContentType(mimeType);
//2,设置下载窗口,通过操作"Content-Disposition"
//不同的浏览器对文件名称的编码方式不同,以Chrome浏览器为代表的是以utf-8对文件名称进行编码
//其他的一些浏览器以base64对文件名称进行编码
//判断使用的浏览器的类型User-Agent
String userAgent = request.getHeader("User-Agent");
String newFileName = null;
if (userAgent.contains("Chrome")) {
//以utf-8进行编码
newFileName = URLEncoder.encode(fileName,"utf-8");
} else {
//以base64进行编码
newFileName = base64EncodeFileName(fileName);
}
response.setHeader("Content-Disposition","attachement;filename="+newFileName);
//3,开始io读写(完成下载功能)
//服务器中的 1588737734261-美女2.jpg
String path = request.getRealPath("upload") + File.separator + fileName;
System.out.println(path);
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(path));
ServletOutputStream outputStream = response.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(outputStream);
byte[] bys = new byte[8192];
int len = -1;
while ((len = bis.read(bys)) != -1) {
bos.write(bys,0,len);
}
bis.close();
bos.close();
自定义文件上传
//获取本地文件对应的输入流
String path = "C:\\Users\\qiuzhiwei\\Desktop\\aaa.txt";
try {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(path));
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),10241);
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
byte[] bys = new byte[8192];
int len = -1;
while ((len = bis.read(bys)) != -1) {
bos.write(bys,0,len);
}
bis.close();
bos.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
//获取接收端的套接字
ServerSocket serverSocket = new ServerSocket(10241);
//相当于发送端的套接字
Socket socket = serverSocket.accept();
//获取对应的输入流,包含了发送端发送过来的数据
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
String destPath = "F:\\workspace\\day66\\out\\artifacts\\day66_war_exploded\\upload\\"+System.currentTimeMillis()+"-copy.txt";
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destPath));
byte[] bys = new byte[8192];
int len = -1;
while ((len = bis.read(bys)) != -1) {
bos.write(bys,0,len);
}
bis.close();
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
自定义文件上传优化
try {
//获取接收端的套接字
ServerSocket serverSocket = new ServerSocket(10241);
while (true) {
new Thread(){
@Override
public void run() {
//相当于发送端的套接字
Socket socket = null;
try {
socket = serverSocket.accept();
//获取对应的输入流,包含了发送端发送过来的数据
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
String destPath = "F:\\workspace\\day66\\out\\artifacts\\day66_war_exploded\\upload\\"+System.currentTimeMillis()+"-copy.txt";
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destPath));
byte[] bys = new byte[8192];
int len = -1;
while ((len = bis.read(bys)) != -1) {
bos.write(bys,0,len);
}
bis.close();
bos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
} catch (IOException e) {
e.printStackTrace();
}