目录
二、使用URLEncoder解决谷歌和IE浏览器中文下载名乱码问题
三、 使用Base64解编码操作解决火狐浏览器中文下载名乱码问题
文件的上传
一、步骤
1、要有一个form标签,method=post请求
2、form标签的encType属性值必须为multipart/form-data值
3、在form标签中使用input type=file添加上传的文件
4、编写服务器代码接收,处理上传的数据
enctype="multipart/form-data",表示提交的数据,以多段(每个表单项一个数据段)的形式进行拼接,然后以二进制流的方式发送给服务器
二、上传常用的类和方法
commons-fileupload.jar和commons-io.jar包中
常用的类:
ServletFileUpload类,用于解析上传的数据
FileItem类,表示每一个表单项
常用方法:
<form action="http://localhost:8080/09_EL_JSTL/uploadServlet" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="username"/><br/>
头像:<input type="file" name="photo"><br/>
<input type="submit" value="上传"/>
</form>
public class UploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1、先判断上传的数据是否是多段数据(只有多段式,才是文件上传)
if(ServletFileUpload.isMultipartContent(req)){
//创建 FileItemFactory 工厂实现类
FileItemFactory fileItemFactory=new DiskFileItemFactory();
//创建用于解析上传数据的工具类ServletFileUpload类
ServletFileUpload servletFileUpload=new ServletFileUpload(fileItemFactory);
//解析上传的数据,得到每一个表单项FileItem
try{
List<FileItem> list=servletFileUpload.parseRequest(req);
//循环遍历,判断每一个表单项是普通类型还是上传类型
for(FileItem fileItem:list){
if(fileItem.isFormField()){
//普通表单项
System.out.println("表单项的name属性值:"+fileItem.getFieldName());
//参数UTF-8解决乱码问题
System.out.println("表单项的value属性值:"+fileItem.getString("UTF-8"));
}else{
//上传文件
System.out.println("表单项的name属性值:"+fileItem.getFieldName());
System.out.println("上传的文件名:"+fileItem.getName());
fileItem.write(new File("e:\\+fileItem.getName()"));
}
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}
文件的下载
一、文件下载的实现
public class DownLoadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1、获取要下载的文件名
String downloadFileName="a.jsp";
//2、读取要下载的文件内容(通过ServletContext对象可以读取)
ServletContext servletContext=getServletContext();
//4、回传前的操作
//获取要下载的类型,告诉客户端
String mimeType = servletContext.getMimeType("路径名");
resp.setContentType(mimeType);
//告诉客户端收到的数据用于下载(使用响应头)
//Content-Disposition表示收到的数据怎么处理
// attachment表示附件,即下载
resp.setHeader("Content-Disposition","attachment;filename=文件名");
InputStream resourceAsStream = servletContext.getResourceAsStream("路径");
//3、把下载的文件内容回传给客户端
//获取响应的输出流
OutputStream outputStream = resp.getOutputStream();
//读取输入流中全部的数据,复制给输出流,输出给客户端
IOUtils.copy(resourceAsStream,outputStream);
}
}
二、使用URLEncoder解决谷歌和IE浏览器中文下载名乱码问题
resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode("中国.jpg","UTF-8"));
三、 使用Base64解编码操作解决火狐浏览器中文下载名乱码问题
resp.setHeader("Content-Disposition","attachment;filename==?UTF-8?B?"+new BASE64Encoder().encode("中国.jsp".getBytes("utf-8"))+"?=");
BASE64编解码操作原理:
public class Base64Test {
public static void main(String[] args) throws Exception {
String content="这里是BASE64Encoder编解码操作";
//创建一个Base64编码器
BASE64Encoder base64Encoder=new BASE64Encoder();
//执行编码操作
String encodeString = base64Encoder.encode(content.getBytes("utf-8"));
System.out.println(encodeString);
//创建一个Base64解码器
BASE64Decoder base64Decoder=new BASE64Decoder();
//执行解码操作
byte[] bytes = base64Decoder.decodeBuffer(encodeString);
content=new String(bytes,"utf-8");
System.out.println(content);
}
}
运行结果:
6L+Z6YeM5pivQkFTRTY0RW5jb2Rlcue8luino+eggeaTjeS9nA==
这里是BASE64Encoder编解码操作
四、考虑所有浏览器的兼容问题
if(req.getHeader("User-Agent").contains("Firefox")){
//如果是火狐浏览器使用Base64编码
resp.setHeader("Content-Disposition","attachment;filename==?UTF-8?B?"+new BASE64Encoder().encode("中国.jsp".getBytes("utf-8"))+"?=");
}else{
//如果不是火狐浏览器,是IE或谷歌浏览器,使用URL编码操作
resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode("中国.jpg","UTF-8"));
}