Struts 2多文件上传路径问题

大明哥_
Java领域优质创作者
博客专家认证
2012-03-26 12:32:30
不多说了!直接贴代码!!
upload(是放在WebRoot下的)
public String execute() throws Exception{
//取得需要上传的文件数组
File[] files = getUpload();
//遍历每个需要上传的文件
for (int i = 0; i < files.length; i++) {
System.out.println(files[i]);
//以服务器的文件保存地址和源文件名建立上传文件输出流
FileOutputStream fos = new FileOutputStream(getSavePath()+"\\"+getUploadFileName()[i]);
//以每个需要上传的文件建立输入流
FileInputStream fis = new FileInputStream(files[i]);
//将每个需要上传的文件写入
byte[] buffer = new byte[1024];
int length = 0;
while ((length=fis.read(buffer))>0) {
fos.write(buffer,0,length);
}
fos.close();
}
return SUCCESS;
}



<package name="mystruts" extends="struts-default">
<action name="upload" class="com.app.action.UploadAction">
<!-- 动态设置Action的savePath属性 -->
<param name="savePath">/upload</param>
<!-- 配置文件上传的拦截器 -->
<interceptor-ref name="fileUpload">
<!-- 配置允许上传的文件类型 -->
<param name="allowedTypes">image/png,image/gif,image/jpeg</param>
<param name="maximumSize">20480000</param>
</interceptor-ref>

<!-- 配置系统默认的拦截器 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<result name="success">/success.jsp</result>
<result name="input">/upload.jsp</result>
</action>
</package>


个人感觉应该是没有问题的:但是上传的时候就是报如下错误:
java.io.FileNotFoundException: \upload\gyutiu.jpg (系统找不到指定的路径。)
java.io.FileOutputStream.open(Native Method)
java.io.FileOutputStream.<init>(FileOutputStream.java:179)
java.io.FileOutputStream.<init>(FileOutputStream.java:70)
com.app.action.UploadAction.execute(UploadAction.java:64)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
。。。。。。。。。。。。。
求解!!!!!!!!
...全文
242 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
大明哥_ 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xiaos_hui 的回复:]
引用 3 楼 chenssy 的回复:
为什么FileNotFoundException: \upload\gyutiu.jpg 至少应该是个绝对路径???
我进行单文件上传的时候,那样写可以啊。。为什么多文件上传就不可以呢??

写文件就这么一句 fos.write(buffer,0,length); 是不是不依赖web容器
你在向磁盘写文件,相对路径是不是一定可以找到对应的绝对路径……
[/Quote]
我的file属性是一样的!!
我已经测试了,其实路径还是错了的!!!!
大明哥_ 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xiaos_hui 的回复:]
引用 5 楼 crlystaldong 的回复:

我記得是要在添加strut2上傳時產生的temp文件的,也是叫Upload的,它是先把文件放這個路徑下的,應該就是not found那個,具體也回去查下。

LZ是写文件NotFound的
struts2上传产生temp文件 但根本不用关心它
Action中的File本身就是temp文件 execute中做的不过是把已经上传了的临时……
[/Quote]

嗯。。。。
潇水汀寒 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 crlystaldong 的回复:]

我記得是要在添加strut2上傳時產生的temp文件的,也是叫Upload的,它是先把文件放這個路徑下的,應該就是not found那個,具體也回去查下。
[/Quote]
LZ是写文件NotFound的
struts2上传产生temp文件 但根本不用关心它
Action中的File本身就是temp文件 execute中做的不过是把已经上传了的临时文件拷到某个自定义目录
潇水汀寒 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 chenssy 的回复:]
为什么FileNotFoundException: \upload\gyutiu.jpg 至少应该是个绝对路径???
我进行单文件上传的时候,那样写可以啊。。为什么多文件上传就不可以呢??
[/Quote]
写文件就这么一句 fos.write(buffer,0,length); 是不是不依赖web容器
你在向磁盘写文件,相对路径是不是一定可以找到对应的绝对路径呢

多文件上传跟上面的问题没关系
请保证页面多个file标签的name属性一样
不一样的话就得在Action中分别处理 自寻烦恼了
潇水汀寒 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 chenssy 的回复:]

我的file属性是一样的!!
我已经测试了,其实路径还是错了的!!!!
[/Quote]
那还真猜不出 调试一下吧
每次循环结束你把输入流也关闭试试
fis.close();
小V小V志 2012-03-26
  • 打赏
  • 举报
回复
我記得是要在添加strut2上傳時產生的temp文件的,也是叫Upload的,它是先把文件放這個路徑下的,應該就是not found那個,具體也回去查下。
大明哥_ 2012-03-26
  • 打赏
  • 举报
回复
加上这一句确实是可以的
String root = ServletActionContext.getRequest().getSession().getServletContext().getRealPath("/upload");

FileOutputStream fos = new FileOutputStream(root+"\\"+getUploadFileName()[i]);

但是我那样写是相对路径啊!!!
为什么FileNotFoundException: \upload\gyutiu.jpg 至少应该是个绝对路径???
我进行单文件上传的时候,那样写可以啊。。为什么多文件上传就不可以呢??
潇水汀寒 2012-03-26
  • 打赏
  • 举报
回复
修正:
File destFile = new File(root, fileFileName.get(i));
改为:
File destFile = new File(root, fileFileName.[i]);
潇水汀寒 2012-03-26
  • 打赏
  • 举报
回复
路径错了
getSavePath()+"\\"+getUploadFileName()[i] 值应该是部署路径+[自定义目录+]文件名
FileNotFoundException: \upload\gyutiu.jpg 至少应该是个绝对路径
另外你代码没贴全 只能猜了
你的输入流是通过files[i]拿到的 那你得保证Action中有filesFileName和filesContentType两个属性

private File[] files;
private File[] fileFileName;
private File[] fileContentType;
//getters && setters
public String execute() throws Exception {
for (int i = 0; i < files.length; i++) {
//...
String root = ServletActionContext.getRequest().getSession()
.getServletContext().getRealPath("/upload");
//加点东西 保证目录: %deployPath%+"/upload" 存在
File destFile = new File(root, fileFileName.get(i));
//...
}

贴一段org.apache.struts2.interceptor.FileUploadInterceptor部分代码,你就知道ContentType 和 FileName 是拼出来的了:

if (files != null && files.length > 0) {
List<File> acceptedFiles = new ArrayList<File>(files.length);
List<String> acceptedContentTypes = new ArrayList<String>(files.length);
List<String> acceptedFileNames = new ArrayList<String>(files.length);
String contentTypeName = inputName + "ContentType";
String fileNameName = inputName + "FileName";

for (int index = 0; index < files.length; index++) {
if (acceptFile(action, files[index], fileName[index], contentType[index], inputName, validation, ac.getLocale())) {
acceptedFiles.add(files[index]);
acceptedContentTypes.add(contentType[index]);
acceptedFileNames.add(fileName[index]);
}
}

if (!acceptedFiles.isEmpty()) {
Map<String, Object> params = ac.getParameters();

params.put(inputName, acceptedFiles.toArray(new File[acceptedFiles.size()]));
params.put(contentTypeName, acceptedContentTypes.toArray(new String[acceptedContentTypes.size()]));
params.put(fileNameName, acceptedFileNames.toArray(new String[acceptedFileNames.size()]));
}
}

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧