上传文件报错java.io.FileNotFoundException (文件名、目录名或卷标语法不正确。)

时间:2021-02-05 19:10:44
做上传文件的时候出现这问题,百度了半天也没解决,麻烦大神指点下,谢谢!!
代码如下:
try {
// 1. 创建工厂对象
FileItemFactory factory = new DiskFileItemFactory();
// 2. 文件上传核心工具类
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置大小限制参数
upload.setFileSizeMax(10*1024*1024); // 单个文件大小限制
upload.setSizeMax(50*1024*1024); // 总文件大小限制
upload.setHeaderEncoding("UTF-8"); // 对中文文件编码处理

// 判断
if (upload.isMultipartContent(request)) {
// 3. 把请求数据转换为list集合
List<FileItem> list = upload.parseRequest(request);
// 遍历
for (FileItem item : list){
// 判断:普通文本数据
if (item.isFormField()){
// 获取名称
String name = item.getFieldName();
// 获取值
String value = item.getString();
System.out.println(value);

// 文件表单项
else {
/******** 文件上传 ***********/
// a. 获取文件名称
String name = item.getName();
// ----处理上传文件名重名问题----
 //a1. 先得到唯一标记
String id = UUID.randomUUID().toString();
 //a2. 拼接文件名
name = id + "#" + name;

// b. 得到上传目录
String basePath = getServletContext().getRealPath("/upload");
// c. 创建要上传的文件对象
File file = new File(basePath,name);
// d. 上传
item.write(file);
item.delete();  // 删除组件运行时产生的临时文件
}
}
}
} catch (Exception e) {
e.printStackTrace();
}

错误提示:
java.io.FileNotFoundException: D:\apache-tomcat-8.0.32\webapps\FileMgrPrj\upload\a643f900-b79a-4c15-870e-22163ab5ead2#C:\Users\cr\Desktop\JavaUtils.txt (文件名、目录名或卷标语法不正确。)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(Unknown Source)
at java.io.FileOutputStream.<init>(Unknown Source)
at java.io.FileOutputStream.<init>(Unknown Source)
at org.apache.commons.fileupload.disk.DiskFileItem.write(DiskFileItem.java:416)
at edu.fjnu.cr.FileMgrServlet.upload(FileMgrServlet.java:99)
at edu.fjnu.cr.FileMgrServlet.doGet(FileMgrServlet.java:38)
at edu.fjnu.cr.FileMgrServlet.doPost(FileMgrServlet.java:185)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:522)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1095)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)

2 个解决方案

#1


name = id + "#" + name;  这句 
文件名中出现了 C:\Users\cr\Desktop\JavaUtils.txt ?文件名不能有:和\ 
 item.getName(); 得到的是什么?

#2


name = id + "#" + name;
改成
name = id + File.separatorChar + FilenameUtils.getName(name);
你原来的名称包含客户端的路径 是不正确的做法

FilenameUtils来自org.apache.commons.io http://commons.apache.org/proper/commons-io/

#1


name = id + "#" + name;  这句 
文件名中出现了 C:\Users\cr\Desktop\JavaUtils.txt ?文件名不能有:和\ 
 item.getName(); 得到的是什么?

#2


name = id + "#" + name;
改成
name = id + File.separatorChar + FilenameUtils.getName(name);
你原来的名称包含客户端的路径 是不正确的做法

FilenameUtils来自org.apache.commons.io http://commons.apache.org/proper/commons-io/