upload.jsp的部分源代码:
<html:form action="upload.do" method="post">
请选择需要上传的照片:
<html:file property="photoFile"/>
<html:submit value="上传"/>
</html:form>
接下来需要在ActionForm中声明这个属性,并设置getter和setter方法,这部分源代码如下:
public class UploadForm extends ActionForm {
protected FormFile photoFile;
public FormFile getPhotoFile() {
return photoFile;
}
public void setPhotoFile(FormFile photoFile) {
this.photoFile = photoFile;
}
}
这个表单的photoFile属性不是String或boolean,而是 org.apache.struts.upload.FormFile。因为用户上传的是一个二进制文件,而HTTP协议是以文本形式传输数据的,这就需 要进行转换。打个比方,一辆汽车需要从甲地送到乙地,但是两地之间只有一条索道,汽车没法开,所以就想个办法在甲地把汽车先拆了,把零件送到乙地再重新组 装成一辆汽车。FormFile起的就是拆卸和组装的作用,只不过它把拆卸、传输和组装的过程都封装起来了,我们看到的是一辆汽车从甲地开进 FormFile,过一会它就从乙地开出来了J我们要决定的只是把它停到什么地方,这就是Action的活了。
public class uploadAction extends Action{
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception{
UploadForm uploadForm = (UploadForm) form;
if (!photoFile.getFileName().equals("")) {
try {
InputStream stream = photoFile.getInputStream();
String filePath = request.getRealPath("/");
filePath=filePath+photoFile.getFileName();
OutputStream bos = new FileOutputStream(filePath);
int bytesRead = 0;
byte[] buffer = new byte[400000];
while ((bytesRead = stream.read(buffer, 0, 400000)) != -1) {
bos.write(buffer, 0, bytesRead);
bos.flush();
bos.close();
stream.close();
}
} catch (Exception e) {
System.err.print(e);
}
photoFile.destroy();
}
return (mapping.findForward("toIndex"));
}
}
struts-config.xml中<action-mappings>里如下定义:
<action path="/upload" type="com.webex.tmis.uploadAction" name="UploadForm" scope="request" input="/wrong.jsp" />
运行一下:抛出如下异常:
struts的argument type mismatch错误..
java.lang.IllegalArgumentException: Cannot invoke com.webex.tmis.uploadForm.setPhotoFile - argument type mismatch,
debug 了一下,原来是要把String 强行转换成FormFile,所以才会抛出argument type mismatch,一查,原来是这样的:表单(html:form)中enctype="multipart/form-data"的意思,是设置表单的 MIME编码,默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;只有使用了 multipart/form-data,才能增加传递文件数据的功能,进行下面的操作.enctype="multipart/form-data"是 上传二进制数据; form里面的input的值以2进制的方式传过去。在html的form中加入enctype="multipart/form-data"的时候,图 片上传问题解决了。
upload.jsp代码如下:
<html:form action="upload.do" enctype="multipart/form-data" method="post">
请选择需要上传的照片:
<html:file property="photoFile"/>
<html:submit value="上传"/>
</html:form>