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> |