<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
用于封装单个表单字段元素的数据。
处理文件上传的核心类
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
package com.yue;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.List;
import java.util.UUID;
public class UploadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
//设置ContentType的值
resp.setContentType("text/html;charset=utf-8");
//创建DiskFileItemFactory工厂对象
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
//设置文件缓存目录,如果目录不存在就新建一个
File file = new File("E:\\new");
if (!file.exists()) {
file.mkdirs();
}
//设置缓存路径
diskFileItemFactory.setRepository(file);
//创建ServletFileUpload对象
ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
//设置字符编码
servletFileUpload.setHeaderEncoding("utf-8");
//解析request,得到上传文件FileItem对象
List fileItems = servletFileUpload.parseRequest(req);
//获取字符流
PrintWriter writer = resp.getWriter();
//遍历集合
for (FileItem fileItem : fileItems) {
//判断是否是普通字段
if (fileItem.isFormField()) {
//获得字段名和字段值
String name = fileItem.getFieldName();
if (name.equals("name")) {
//如果文件不为空,将其保存在value中
if (!fileItem.getString().equals("")) {
String value = fileItem.getString("utf-8");
writer.print("上传者:" + value + "
");
}
}
}else {
//获取上传的文件名
String name = fileItem.getName();
if(name != null && !name.equals("")){
writer.print("上传者文件名称是:" +name + "
");
}
//截取出文件名
name = name.substring(name.lastIndexOf("\\") + 1);
//文件名需要唯一性
name = UUID.randomUUID().toString() + "_" + name;
//在服务器创建同名文件
String webPath = "/upload";
//将服务器中文件加路径域文件名组合成完整的服务器端路径
String realPath = getServletContext().getRealPath(webPath + name);
//创建文件
File file1 = new File(realPath);
file1.getParentFile().mkdirs();
file1.createNewFile();
//获得上传文件流
InputStream inputStream = fileItem.getInputStream();
//使用FileoutputStream打开服务器端上传文件
FileOutputStream fileOutputStream = new FileOutputStream(file1);
//流的拷贝
byte[] bytes = new byte[1024];//每次读取一个字节
int len;
//开始读取上传文件的字节,并将其输出到服务器的上传文件输出流中
while((len = inputStream.read(bytes))>0){
fileOutputStream.write(bytes,0,len);
//关闭流
inputStream.close();
fileOutputStream.close();
//删除临时文件
fileItem.delete();
writer.print("上传文件成功!
");
}
}
}
}catch (Exception e){
throw new RuntimeException(e);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
文件的下载:从服务器端把文件保存到本地
文件的下载:一个流两个头
>>> 一个流:文件的字节输入流
>>> 两个头(相应头):
Content-Type:对应文件的MIME的类型,可以理解为文件的扩展名
Content-Dispostion:以下载框的方式保存文件。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
下载文件
package com.yue;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
public class DownloadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决中文乱码问题
resp.setContentType("text/html;charset=utf-8");
//获取下载文件的名称,在这里可以使用req和resp,这里的下载的servletfileupload和上传的没有关系。
String filename = req.getParameter("filename");
// String filename = "1.jpg";
//获取文件的类型
// String mimeType = getServletContext().getMimeType(filename);
//通知浏览器以下载的方式打开
resp.setHeader("Content-Type","application/octet-stream");
resp.setHeader("Content-Disposition","attachment;filename="+filename);
String folder ="/download";
//获取文件的字节输入流
InputStream resourceAsStream = getServletContext().getResourceAsStream(folder + filename);
//获取文件的字节输出流
ServletOutputStream outputStream = resp.getOutputStream();
byte[] bytes = new byte[1024];
int len;
while((len = resourceAsStream.read(bytes) )!=-1){
outputStream.write(bytes,0,len);
}
outputStream.close();
resourceAsStream.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
方式一
在download.jsp
下载文件是中文1
在DownloadServlet
resp.setHeader(“Content-Disposition”,“attachment;filename=”+ URLEncoder.encode(filename,“utf-8”));
只在IE浏览器中有效
方式二
添加一个工具类
根据浏览器的不同,进行不同的编码
package com.yue;
import sun.misc.BASE64Encoder;
import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
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;
}
}
package com.yue;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
public class DownloadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决中文乱码问题
resp.setContentType("text/html;charset=utf-8");
//获取下载文件的名称,在这里可以使用req和resp,这里的下载的servletfileupload和上传的没有关系。
String filename = req.getParameter("filename");
// String filename = "1.jpg";
//获取文件的类型
// String mimeType = getServletContext().getMimeType(filename);
//通知浏览器以下载的方式打开
resp.setHeader("Content-Type","application/octet-stream");
resp.setHeader("Content-Disposition","attachment;filename="+filename);
//中文方式1
// resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(filename,"utf-8"));
//中文方式2
// filename = DownUtils.filenameEncoding(filename, req);
// resp.setHeader("Content-Disposition","attachment;filename="+filename);
String folder ="/download";
//获取文件的字节输入流
InputStream resourceAsStream = getServletContext().getResourceAsStream(folder + filename);
//获取文件的字节输出流
ServletOutputStream outputStream = resp.getOutputStream();
byte[] bytes = new byte[1024];
int len;
while((len = resourceAsStream.read(bytes) )!=-1){
outputStream.write(bytes,0,len);
}
outputStream.close();
resourceAsStream.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
download.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@page import="java.net.URLEncoder"%>
Title
下载文件
">下载文件是中文1
下载文件是中文2