struts:實現圖片的上傳 argument type mismatch error

ysuncn發表於2020-04-05

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>

相關文章