①IE低版本的文件名称Bug解决
问题:使用fileItem.getName()这个方法的时候,可以拿到文件名称,一般浏览器拿到的格式:xx.png
但IE拿到的是D:/xx/xx/xx.png 我们的功能就实现不了
解决方案:使用导入的IO包中的
FilenameUtils 工具类中的getName()方法 可以拿到 xx.png
于是:咱们把拿到名称的代码进行修改即可
修改前(在IE低版本中有问题): |
String fileName =fileItem.getName(); |
修改后(解决了IE低版本中拿文件名称的问题): |
String fileName = FilenameUtils.getName(fileItem.getName()); |
②上传的文件的名称冲突问题
问题:如果存在了同名的文件就会上传失败或者替换原来的文件
解决方案:把上传的文件名称改成一个随机的数计可(注:后缀不可变)
代码分析: |
//拿到文件的名称 String fileName = FilenameUtils.getName(fileItem.getName()); //拿到文件的后缀 String extName = FilenameUtils.getExtension(fileName); //生成随机的名称,可以是一个时间字符串 Date date=new Date(); String upname=String.valueOf(date); String fileUUIDName = UUID.randomUUID().toString(); //结合成我们的随机名称(带后缀) String randomFileName = fileUUIDName+"."+extName; //最后文件上传的位置 File uploadFile = new File("D:/",randomFileName); |
注意:在拼接文件名的时候一定不要忘记"."
③解决文件保存位置的问题
问题:现在我的文件保存的路径是磁盘,有的操作系统是没有盘符的那该怎么办呢?
解决方案:直接把文件保存到我们的项目就可以了
//拿到当前项目的根目录路径(实际路径)通过上下文对象去拿
super.getServletContext().getRealPath("/");括号里面可以写我们文件想保存的路径
但是你的项目下面必须有这个文件夹(我是创建了一个upload文件夹)
代码:拿到本项目中的路径 |
//最后文件上传的位置 String realPath = super.getServletContext().getRealPath("/upload"); File uploadFile = new File(realPath,randomFileName); |
如果路径设置有问题会抛出文件路径找不到的异常:检查你的项目下是否有这个路径存在
代码:
@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建一个工厂解析这个请求,得到的是一个集合,这个集合装的就是一个请求对象,封装的就是每一条请求数据
try {
// 创建一个工厂
FileItemFactory factory = new DiskFileItemFactory();
// 创建一个文件上传的处理器
ServletFileUpload upload = new ServletFileUpload(factory);
//解析这个请求:解析完之后咱们可以拿到一个FileItem的集合
List < FileItem > items = upload.parseRequest(req);
//通过遍历集合可以拿到上传的文件的属性值,包括属性名,值..
for (FileItem fileItem : items) {
//上面的测试可以看输出,普通控件和file控件的处理方式是要区别对待的
if(fileItem.isFormField()){
//代表是一般表单,用一般表单的处理方式解决即可
//String username = req.getParameter("username");
//String password = req.getParameter("password");
}else{
//拿到上传文件的名称(有ie版本问题)
//String upname=fileItem.getName();
//解决方案
//String upname = FilenameUtils.getName(fileItem.getName());
//解决重名文件上传的问题
//①获得上传文件的名称
String upname = FilenameUtils.getName(fileItem.getName());
//②获得上传文件的后缀名(使用FilenameUtils工具类)
String extName = FilenameUtils.getExtension(upname);
//③生成一个随机的名称 提供了两种方式
String fileUUIDName = UUID.randomUUID().toString();
// Date date=new Date();
// String str=String.valueOf(date);
//拼接成一个新的文件名称,作为文件上传后的保存名称
String upFileName=fileUUIDName+"."+extName;
//解决保存路路径的问题
//①拿到上传文件在项目中保存的路径
String realPath = super.getServletContext().getRealPath("/upload");
System.out.println(realPath);
//确定文件上传的位置
File uploadFile = new File(realPath,upFileName);
//将本地的文件写到服务器中
fileItem.write(uploadFile);
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
我也是一个初学者,只是把我的一些理解放在上面,还有很多的不足,请多多给些建议!