struts:实现图片的上传 argument type mismatch error

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>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值