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>
相關文章
- vue 實現貼上上傳圖片Vue
- formData原生實現圖片上傳ORM
- error: invalid type argument of unary ‘*‘ (have ‘int‘) *__first = __tmp;Error
- PHP實現圖片(檔案)上傳PHP
- element-ui+Vue實現的圖片上傳UIVue
- Java實現圖片上傳到伺服器,並把上傳的圖片讀取出來Java伺服器
- struts動態多檔案上傳實現
- node+express實現圖片上傳功能Express
- layui中實現上傳圖片壓縮UI
- 通過API介面實現圖片上傳API
- 使用Vue實現圖片上傳的三種方式Vue
- SpringMVC實現ajax上傳圖片實時預覽SpringMVC
- 前端的圖片壓縮image-compressor(可在圖片上傳前實現圖片壓縮)前端
- django 實現圖片上傳和顯示操作Django
- 用Vue來實現圖片上傳多種方式Vue
- FileReader初步使用實現上傳圖片預覽效果
- 上傳圖片
- 如何實現一個簡易的圖片上傳Web ServerWebServer
- 個人圖床配置,實現部落格園圖片上傳自由圖床
- Vue +Element Ui 使用Upload元件實現多圖片上傳VueUI元件
- Django實現圖片上傳並前端頁面顯示Django前端
- html input type=file 選擇圖片,圖片預覽 純html js實現圖片預覽HTMLJS
- PbootCMS上傳圖片變模糊、上傳圖片尺寸受限的解決方案boot
- electron上傳圖片
- 上傳圖片jsJS
- 裁剪上傳圖片
- 短視訊平臺開發,圖片上傳和圖片預覽功能實現
- 圖片上傳及圖片處理
- java,springboot + thymeleaf 上傳圖片、刪除圖片到伺服器、本地,壓縮圖片上傳(有些圖片會失真),原圖上傳JavaSpring Boot伺服器
- 如何呼叫第三方API實現圖片上傳。API
- Java和PHP兩種方式實現上傳圖片到新浪微博的圖床JavaPHP圖床
- 多圖片formpost上傳ORM
- spring boot 圖片上傳Spring Boot
- 測試圖片上傳
- input file圖片上傳
- 本地Markdown上傳圖片
- ci框架中的圖片上傳框架
- 基於SpringMVC的上傳圖片SpringMVC