Struts2文件上传action接收到的File为null?求助!!!

yuyong1989 2011-05-11 01:00:37
struts.xml 代码如下:

<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

<package name ="fileUploadDemo" extends ="struts-default">
<action name ="fileUpload" class ="org.qiujy.web.struts2.FileUploadAction">

<!-- 动态设置Action中的savePath属性的值 -->
<param name="savePath">/upload</param>
<result name ="success">/succ.jsp</result>
</action >
</package >
</struts>



jsp代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<html>
<head>
<title>Struts2 File Upload</title>
</head>
<body>
<form action="fileUpload.action" method="POST" enctype="multipart/form-data">
文件标题:<input type="text" name="title" size="50"/><br/>
选择文件:<input type="file" name="upload" size="50"/><br/>
<input type="submit" value=" 上传 "/>
</form>
</body>
</html>


action 代码:

package org.qiujy.web.struts2;


import java.io.IOException;


import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.io.OutputStream;

import javax.servlet.ServletContext;



import org.apache.struts2.ServletActionContext;



import com.opensymphony.xwork2.ActionSupport;



/**

*处理文件上传的Action类

*@authorqiujy

*@version1.0

*/

public class FileUploadAction extends ActionSupport {

// private static final int BUFFER_SIZE = 16 * 1024;
// 文件标题
private String title;
// 上传文件域对象
private File upload;
// 上传文件名
private String uploadFileName;
// 上传文件类型
private String uploadContentType;
// 保存文件的目录路径(通过依赖注入)




public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public File getUpload() {
return upload;
}

public void setUpload(File upload) {
this.upload = upload;
}

public String getUploadFileName() {
return uploadFileName;
}

public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}

public String getUploadContentType() {
return uploadContentType;
}

public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}

@Override
public String execute() throws Exception {
//根据服务器的文件保存地址和原文件名创建目录文件全路径

ServletContext svct = ServletActionContext.getServletContext();
System.out.println(upload);
if(upload != null)
{
String dataDir = svct.getRealPath("/upload");
File saveFile = new File(dataDir,uploadFileName);
upload.renameTo(saveFile);
}
return SUCCESS;
}
}


测试时只能上传txt文件,其他格式的文件都不能上传,打印出的upload为null。
求解释是哪里出了问题!!!!

...全文
2458 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
额,学习了。。。
wiselight 2011-05-12
  • 打赏
  • 举报
回复
没添加拦截器
zhangsanja 2011-05-12
  • 打赏
  • 举报
回复
用不同的浏览器试试,帮顶。
yanfei_nn 2011-05-12
  • 打赏
  • 举报
回复
这段代码我已经试过了,没有任何问题,包括任何文件。但是struts-default.xml文件中默认限制上传2M的文件。

<struts>

<constant name="struts.action.extension" value="do" />
<constant name="struts.i18n.encoding" value="GBK" />
<constant name="struts.devMode" value="true" />
<constant name="struts.configuration.xml.reload" value="true" />

<package name="con.duoyide" extends="struts-default">
<action name="fileUpload"
class="com.duoyide.action.FileAction">
<result name="success">/success.jsp</result>
</action>
</package>

</struts>


<%@ page language="java" pageEncoding="GBK"%>
<html>
<head>
<title>Struts2 File Upload</title>
</head>
<body>
<form action="fileUpload.do" method="POST"
enctype="multipart/form-data">
文件标题:
<input type="text" name="title" size="50" />
<br />
选择文件:
<input type="file" name="upload" size="50" />
<br />
<input type="submit" value=" 上传 " />
</form>
</body>
</html>


public class FileAction extends ActionSupport {

private static final long serialVersionUID = 1189106219658323341L;

public static final int BUFFER_SIZE = 16 * 1024;

// 文件标题
private String title;

// 上传文件域对象
private File upload;

// 上传文件名
private String uploadFileName;

// 上传文件类型
private String uploadContentType;

// 保存文件的目录路径(通过依赖注入)
public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public File getUpload() {
return upload;
}

public void setUpload(File upload) {
this.upload = upload;
}

public String getUploadFileName() {
return uploadFileName;
}

public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}

public String getUploadContentType() {
return uploadContentType;
}

public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}

@Override
public String execute() throws Exception {
// 根据服务器的文件保存地址和原文件名创建目录文件全路径

ServletContext svct = ServletActionContext.getServletContext();
System.out.println(upload);
if (upload != null) {
String dataDir = svct.getRealPath("/upload");
File saveFile = new File(dataDir, title);
upload.renameTo(saveFile);
}
return SUCCESS;
}

}
yanfei_nn 2011-05-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wqmain 的回复:]
引用楼主 yuyong1989 的回复:
测试时只能上传txt文件,其他格式的文件都不能上传,打印出的upload为null。
求解释是哪里出了问题!!!!


是不是你的struts.xml里面限制上传文件的格式了?
[/Quote]
怎么可能是String类型呢
sncm925 2011-05-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yuyong1989 的回复:]
这个没有试过,我刚把chrome跟新了又测试了一下,没问题了。之前版本是7.*,刚跟新到11.0.*了。
这可能是chrome的bug吧[/Quote]

缓存
yuyong1989 2011-05-11
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 a34020249 的回复:]

呵呵,我说呢,我就用的chrome没问题啊,原来是楼主版本太低啦。
[/Quote]

呵呵,就这么个小问题纠结了我好久。。。
a34020249 2011-05-11
  • 打赏
  • 举报
回复
呵呵,我说呢,我就用的chrome没问题啊,原来是楼主版本太低啦。
yuyong1989 2011-05-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 centre10 的回复:]

<form action="fileUpload.action" method="POST" enctype="multipart/form-data">
文件标题:<input type="text" name="title" size="50"/><br/>
选择文件:<input type="file" name="upload" size="50"/><br/>
<input ty……
[/Quote]

这个没有试过,我刚把chrome跟新了又测试了一下,没问题了。之前版本是7.*,刚跟新到11.0.*了。
这可能是chrome的bug吧
  • 打赏
  • 举报
回复
<form action="fileUpload.action" method="POST" enctype="multipart/form-data">
文件标题:<input type="text" name="title" size="50"/><br/>
选择文件:<input type="file" name="upload" size="50"/><br/>
<input type="submit" value=" 上传 "/>

改成struts2的标签试试,<s:form> <s:file>
yuyong1989 2011-05-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cclovescw 的回复:]

额,还真没发现过原来chrome会存在这个问题。。。
[/Quote]

恩,谁会想到是chrome的问题
  • 打赏
  • 举报
回复
额,还真没发现过原来chrome会存在这个问题。。。
yuyong1989 2011-05-11
  • 打赏
  • 举报
回复
刚想到要不要换个浏览器试试,之前用的是chrome测试,后来用IE和firefox测试了下发现居然
没任何问题,顿时湿了,找了一整天的问题居然出在这上面!!!不知道有没有人也遇到过类似
的问题。这是bug吗?
yuyong1989 2011-05-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 slabcde 的回复:]

把upload属性调为String类型
[/Quote]

试过了还是null
yuyong1989 2011-05-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wqmain 的回复:]


是不是你的struts.xml里面限制上传文件的格式了?
[/Quote]


我没设上传格式啊,默认应该都能上传的啊,
下面是Value Stack 里的值,我不懂为啥file,filename,contenttype都为null

Value Stack Contents

Object Property Name Property Value
org.qiujy.web.struts2.FileUploadAction texts null
title jlkjkl
actionErrors []
errors {}
fieldErrors {}
errorMessages []
container There is no read method for container
locale zh_CN
actionMessages []
uploadContentType null
uploadFileName null
upload null
com.opensymphony.xwork2.DefaultTextProvider texts null
千骑卷平冈 2011-05-11
  • 打赏
  • 举报
回复
[Quote=引用楼主 yuyong1989 的回复:]
测试时只能上传txt文件,其他格式的文件都不能上传,打印出的upload为null。
求解释是哪里出了问题!!!!
[/Quote]

是不是你的struts.xml里面限制上传文件的格式了?
爱吃面条 2011-05-11
  • 打赏
  • 举报
回复
把upload属性调为String类型

67,513

社区成员

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

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