上传
注意点:
1.前台页面中提交方式设置为post请求,enctype属属性设置为:multipart/form-data
<form action="servlet类地址" method="post" enctype="multipart/form-data">
</form>
2.需要导入jar包
3.后台代码:
// 创建对象DiskFileItemFactory工厂对象
DiskFileItemFactory factory = new DiskFileItemFactory();
// 创建解析request 接收项对象ServletFileUpload
ServletFileUpload upload = new ServletFileUpload(factory);
//处理中文乱码问题
upload.setHeaderEncoding("utf-8");
//使用upload解析 request获取的数据
List<FileItem> list = upload.parseRequest(request);
if(oneFileItem.isFormField()){
//文本
String name =oneFileItem.getFieldName();// 获取 name 的属性值
if("miaoshu".equals(name)){
//文本
}
}else{
//文件
String only = UUID.randomUUID().toString(); //获取一个随机不可能重复的字符串
String fileName =oneFileItem.getName();// 获取当前上传的文件名
int index = fileName.lastIndexOf(".");
String newFileName = only+fileName.substring(index);//将随机不可能重复的字符串与文件的后缀名拼接起来
// 文件流的读写
InputStream in =oneFileItem.getInputStream();
// 地址 文件要上传复制到哪个地方去
OutputStream out =new FileOutputStream(new File("D:/Eclipse/xiangmu/demo01/WebContent/imge",fileName));
byte [] b = new byte[1024];
int len = 0;
while((len = in.read(b)) != -1){
out.write(b, 0, len);
}//这里是一个while循环不是if判断要是不循环的话就会只执行一遍
in.close();
out.close();
}
下载
下载是超链接中传递参数(例如:id,name),get请求
后台代码:
乱码问题可以参考:解决乱码问题
//获取下载文件的文件名
String fileName = request.getParameter("fileName");
//文件名可能包含中文解决乱码问题
fileName = new String(fileName.getBytes("iso-8859-1"),"utf-8"); //这是get请求的处理接收中文乱码的问题
System.out.println(fileName);
//进行下载
//由于这是在url地址下载的,如果下载的文件名中包含中文的话会导致编码问题 每一个浏览器的编码规则有可能不一样所以需要设置提交设置一下下载文件的文件名
String fileName2 = fileName;
String agent = request.getHeader("user-agent"); //获取浏览器厂商头信息
if(agent.contains("Firefox")){ //Firefox浏览器中包含Firefox字样
fileName2=FireFoxEncoding.base64EncodeFileName(fileName);
}else{
//其他浏览器
fileName2=URLEncoder.encode(fileName,"utf-8");
}
//设置两个头 一个流
//1.设置文件名称的METE值的类型,通过SerevletContext来获取
response.setContentType(this.getServletContext().getMimeType(fileName));
//2.设置content-dispostion
response.setHeader("Content-Disposition", "attachment;fileName="+fileName2);
//下载就是一个响应 开始创建响应输出流
//先读取要下载的文件
//String path = this.getServletContext().getRealPath("/download"); //获取要下载文件的文件夹
System.out.println(fileName2);
InputStream in = new FileInputStream(new File("D:/Eclipse/xiangmu/demo01/WebContent/download",fileName)); //读取这个文件
//再创建一个写的对象
OutputStream out = response.getOutputStream();
//进行读写
byte[] b = new byte[1024];
int len = 0;
while((len=in.read(b))!=-1){
out.write(b, 0, len);
}//这里是一个while循环不是if判断要是不循环的话就会只执行一遍
//关闭流
out.close();
in.close();