闲来无事,整理一下以前学习过得一些知识,如有什么不妥之处还请赐教
依赖于Apache官方的文件处理jar包其中fileupload依赖于下面的io包
接下来上代码,这里我把功能都写到工具类里方便调用
package util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
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;
public class FileUtils {
//这个是获取from表单中的数据放到map中
public static Map<String, Object> getInfoByFrom(HttpServletRequest request) throws FileUploadException {Map<String, Object> map=new HashMap<>();
List<FileItem> list = null;
DiskFileItemFactory factory=new DiskFileItemFactory();
ServletFileUpload upload=new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");
//判断是否为普通表单上传
if(!ServletFileUpload.isMultipartContent(request)){
Enumeration<String> e =request.getParameterNames();
while(e.hasMoreElements()){
String iv=e.nextElement();
map.put(iv, request.getParameter(iv));
}
}else{
list = upload.parseRequest(request);//这里我把异常抛出方便上传失败的处理
for (FileItem fileItem : list) {
if(fileItem.isFormField()){
try {
map.put(fileItem.getFieldName(), fileItem.getString("UTF-8"));// 解决普通输入项的数据的中文乱码问题
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
String filename = fileItem.getName();
if(filename==null || filename.trim().equals("")){
continue;
}
//注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
//处理获取到的上传文件的文件名的路径部分,只保留文件名部分
filename = filename.substring(filename.lastIndexOf("\\")+1);
try {
InputStream in=fileItem.getInputStream();
map.put(filename, in);
map.put(filename+"_size", fileItem.getSize());//文件大小(规定其名字为 文件名_size)
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
return map;
}
public static void sendFile(Object in,String path,byte[] buffer){//支持单个上传
FileOutputStream out=null;
try {
out = new FileOutputStream(path);
int len = 0;
//循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
while((len=((FileInputStream) in).read(buffer))>0){//其实in是inputstream类型
out.write(buffer, 0, len);
}
//关闭输入流
((FileInputStream) in).close();
//关闭输出流
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static String makeFileName(String filename){
//为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名
return UUID.randomUUID().toString() + "_" + filename;
}
public static String fileNameFilter(String filename){
filename=filename.replaceAll("[\\\\?*/<>|:\"]", "");//替换文件名中包含的?<>":|/\*非法字符
if(filename.length()>255){//文件名最长为255
filename=filename.substring(filename.length()-255,filename.length());
}
return filename;
}
public static String makePath(String filename,String savePath){//必须提供根路径
//得到文件名的hashCode的值,得到的就是filename这个字符串对象在内存中的地址
int hashcode = filename.hashCode();
int dir1 = hashcode&0xf; //0--15 其中&表示与运算0x表示16进制f表示15,(16进制的0-F)
int dir2 = (hashcode&0xf0)>>4; //0-15//左移4位
//构造新的保存目录
String dir = savePath + "\\" + dir1 + "\\" + dir2; //upload\2\3 upload\3\5
//File既可以代表文件也可以代表目录
File file = new File(dir);
//如果目录不存在
if(!file.exists()){
//创建目录
file.mkdirs();
}
return dir;
}
public static boolean fileExtName(String ext,String[] abc){//判断文件类型是否合法
for (String string : abc) {
if(ext.equals(string)){
return true;
}
}
return false;
}
}
//下载的部分就比较容易了,也就不写什么工具类了
String filePath= request.getParameter("url");
File file = new File(filePath);
if(!file.exists()){
//如果文件不存在,在这里写处理方式
}
//处理文件名,就是要得到真实文件名(通常上传时都会修改文件名)如果不需要请忽视这一步
String realname = filePath.substring(filePath.indexOf("_")+1);
//设置响应头,控制浏览器下载该文件
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(realname, "UTF-8"));//如果不设置消息头的话就是像在传验证码一样了
//读取要下载的文件,保存到文件输入流
FileInputStream in = new FileInputStream(file);
//创建输出流
OutputStream out = response.getOutputStream();
//创建缓冲区
byte buffer[] = new byte[1024];
int len = 0;
//循环将输入流中的内容读取到缓冲区当中
while((len=in.read(buffer))>0){
//输出缓冲区的内容到浏览器,实现文件下载
out.write(buffer, 0, len);
}
//关闭文件输入流
in.close();
//关闭输出流
out.close();
其中有些内容参考至孤傲苍狼大佬的文章
https://www.cnblogs.com/xdp-gacl/p/4200090.html