论坛首页 Java企业应用论坛

最近写测试struts2上传文件发现的问题

浏览 3753 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-04-25  
最近在写测试 struts2 上传的时候发现个问题 。不知道你们谁有过相同的问题 。我的环境为 jdk1.5,tomcat6.10 。发现的问题就是我在上传多个问题的时候。第一次会失败,发现是没得到我的file对象。发现是没生成临时文件的缘故。点ie的 回退到上传页面(这个时候没刷新)  然后再上传。这样就会成功,这个时候的的临时文件被删除了的。。如果刷新了jsp页面的话 。就会提示空指针异常。我也试图写一个类型转换器 在操作file的时候就去判断file对象的问题。。发现表单的enctype="multipart/form-data"  而我写的 Converter 就没进去起作用了 。付上我的代码。大家研究下。
<%@ page language="java" contentType="text/html; charset=gbk"
    pageEncoding="gbk"%>
    
<%@ taglib prefix="s" uri="/struts-tags" %>
    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title>Insert title here</title>

<script type="text/javascript">

function addMore()
{
	var td = document.getElementById("more");
	
	var br = document.createElement("br");
	var input = document.createElement("input");
	var button = document.createElement("input");
	
	input.type = "file";
	input.name = "file";
	
	button.type = "button";
	button.value = "Remove";
	
	button.onclick = function()
	{
		td.removeChild(br);
		td.removeChild(input);
		td.removeChild(button);
	}
	
	td.appendChild(br);
	td.appendChild(input);
	td.appendChild(button);
	
}

</script>

</head>

<body>

	<table align="center" width="50%">
			<tr>
				<td>

					<s:fielderror cssStyle="color:red" />

				</td>
			</tr>
		</table>


		<s:form action="upload" theme="simple" method="post" enctype="multipart/form-data">

			<table align="center" width="50%" border="1">
				<tr>
					<td>
						username
					</td>
					<td>
						<s:textfield name="username"></s:textfield>
					</td>
				</tr>

				<tr>
					<td>
						password
					</td>
					<td>
						<s:password name="password"></s:password>
					</td>
				</tr>
				<tr>
					<td>
						file
					</td>

					<td id="more">
						<s:file name="file"></s:file><input type="button" value="Add More.." onclick="addMore()">
					</td>
				</tr>
				
				<tr>
					<td>
						<s:submit value=" submit "></s:submit>
					</td>

					<td>
						<s:reset value=" reset "></s:reset>
					</td>
				</tr>
			</table>

		</s:form>

</body>

</html>
下面是action
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class UploadAction extends ActionSupport {
	private String username;

	private String password;

	private List<File> file;
	
	private List<String> fileFileName;

	private List<String> fileContentType;

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public List<File> getFile() {
		return file;
	}

	public void setFile(List<File> file) {
		this.file = file;
	}

	public List<String> getFileFileName() {
		return fileFileName;
	}

	public void setFileFileName(List<String> fileFileName) {
		this.fileFileName = fileFileName;
	}

	public List<String> getFileContentType() {
		return fileContentType;
	}

	public void setFileContentType(List<String> fileContentType) {
		this.fileContentType = fileContentType;
	}

	@Override
	public String execute() throws Exception {
		System.out.println(getFile().size());
		for (int i = 0; i < file.size(); i++) {
			InputStream is = new FileInputStream(file.get(i));

			String root = ServletActionContext.getRequest().getRealPath("/upload");

			File destFile = new File(root, this.getFileFileName().get(i));

			OutputStream os = new FileOutputStream(destFile);

			byte[] buffer = new byte[400];

			int length = 0;

			while ((length = is.read(buffer)) > 0) {
				os.write(buffer, 0, length);
			}

			is.close();

			os.close();
		}

		return SUCCESS;

	}


}
下面是配置
<action name="upload" class="com.eagle.struts2.test.action.UploadAction">
			<result name="success">/uploadResult.jsp</result>
			<result name="input">/upload.jsp</result>
			<!-- <param name="savePath">/upload</param> --> 
			
			<interceptor-ref name="fileUpload">
				<param name="maximumSize">102400</param>
				<!-- <param name="allowedTypes">application/vnd.ms-powerpoint</param> --><!--   在tocamt里面的webxml中可以找到 -->
			</interceptor-ref>
			<interceptor-ref name="defaultStack"></interceptor-ref>
		</action>
   发表时间:2008-04-25  
发现问题所在 。我在别的地方配置了新的拦截器。并且设置了为默认的拦截器。但我在的拦截器栈里面也加上了struts2 里面默认的那个拦截器。。不知道什么原因了。继续研究中。。现在我把我自定义的拦截器屏蔽了。功能就能正常运作了。有点不理解。我没发现我的拦截器有什么问题。都能跑通的。。继续研究吧
0 请登录后投票
   发表时间:2008-06-12  
用spring了?我用了spring后,这个功能偶尔好用。
0 请登录后投票
   发表时间:2008-06-16  
Struts2拦截器是实现多层拦截的,你也可以指定要拦截那个方法,这样就不回报错了。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics