关于java:GWA2吉娃兔????Java中的文件上傳表單處理若干問題

在 GWA2Java 中處理文件上傳的HTML表單被稱爲是“客貨混裝”的HTTP請求處理。

文件上傳處理是HTTP Web開發中較爲非凡的應用,對開發者有肯定的要求。無論是风行的PHP,Aspx或者JSP都须要肯定的處理技巧。由於實在想不起來10多年前是如何赤手純代碼來處理客貨混裝的HTML文件上傳表單,這次還是詳細地記錄一次,以備再過些時日忘卻了而備查。

還有一層考慮是,在處理HTML的文件上傳表單時,须要考慮與 GWA2Java的交融,波及到GWA2 的文件處理的外围模塊,因而也须要或者也是檢視GWA2架構設計的一次極好的機會。
對此前的 GWA2 Java項目标巡視,我們發現已經有一些項目波及到文件上傳,但基本上多數是应用Ajax異步上次等,回避了“客貨混裝”模式,某個HTML表單只負責文件上傳,而另外一個表單再收集其余數據。

所以,這主要在 GWA2Java 中更好的整合進文件上傳,并且是客貨混裝模式——處理一個表單,裏面同時包含兩個字段:張三的姓名文字和張三的頭像圖片。

1. 瀏覽器客戶端 HTML表單中enctype

如果须要在瀏覽器客戶端的HTML表單中進行文件上傳,须要明確顯式地指定 Form元素的 enctype 屬性為 multipart/form-data 。

2. 服務器端接管處理文件上傳的第三方組件

基於 Apache Tomcat的 Java Web Server,進行服務器端的文件上傳處理,推薦应用的組件是 Apache commons-fileupload-1.4.jar , 一并的也要引入 Apache commons-io-2.7.jar。

3. HTTP Request.getParameter 生效

儅客戶端应用文件上傳的表單遞交數據時,Java Web Server中常規的 Servlet 對象 HTTPRequest的次要办法 request.getParameter 就生效。這也是一般程序無法處理客貨混裝的起因之一。

取而代之的,儅 enctype=multipart/form-data , 须要通過第三方組件獲取到相應的表單參數。
在 GWA2 中,其中的路由模塊嚴重依賴HTTP Request的參數,這時候,须要將次要路由參數放入Form的Action屬性中。
能够改進的另外一個办法是,通過引入 Apache commons-fileupload 的相關對象,便当 FormItems 對象,從而獲得表單中的常規非文件字段,文本文件字段的名稱和值。

遍歷FormItems獲得HTTP Request請求參數之後,再通過 request.setAttribute寫回到當前Request對象,如此即可奇妙地彌補 request.getParameter 生效的問題。
由於在 GWA2Java 中,獲取内部參數通常由 Wht.get 的办法進行,這個办法除了調用 request.getParameter 之外,還會進一步地的訪問 request.getAttribute , 從而實現了對 request.setAttribute 的訪問。再進一步地的 Wht.get 還會對訪問數據做一些根本的平安檢查。

樣例代碼:

ServletFileUpload sfileupld = new ServletFileUpload((new DiskFileItemFactory()));
formItems = sfileupld.parseRequest(request); // can only be parsed once!
if (formItems != null && formItems.size() > 0){
String iname, ivalue; byte[] bytes;
for (FileItem item : formItems){
// processes only fields that are common form fields
if (item.isFormField()){
bytes = item.getFieldName().getBytes(“ISO-8859-1”); // why 8859?
iname = new String(bytes, “UTF-8”);
bytes = item.getString().getBytes(“ISO-8859-1”);
ivalue = new String(bytes, “UTF-8”);
request.setAttribute(iname, ivalue);
//debug(“ctrl/item: iname:”+iname+”, ivalue:”+ivalue);
}
}
}

4. HTML表單上傳request 能且僅能被parse一次

上文中提到的獲取 FormItems 须要從 HTTP Request中提取,

List<FormItem> formItems = uploadInstance.parseRequest(request);

這裏的Request,只能被 parseRequest 執行一次,如果在同一次請求處理程序中,再次對這個 request 執行 parseRequest 時,就會返回異常為空的錯誤。
因而,儅我們须要在程序頂部通過便当 FormItems 設置 request.setAttribute 時,還须要保留 FormItems 作爲全局對象,在後面這裏處理實際上傳文件時应用,防止再次調用 parseRequest 產生爲空的錯誤異常。

5. 揮之不去的字符轉碼: 從 ISO-8859-1 到 UTF-8

從心裏上,我們是抗拒在代碼中進行字符集轉碼的,所以從一開始,我們在 GWA2Java 中進行了前後端統一全流程一貫地应用UTF-8字符集,從而防止在系統程序内做無謂的轉碼工作。(參考:-GWA2 Java版本的i18n/中文编码/乱码问题,https://ufqi.com/blog/gwa2-java-i18n/ )

偏偏這裏儅应用客貨混裝模式進行文件上傳時,通過parseRequest出來的 FormItem 其中的非ASCII字符的編碼是 ISO-8859-1 ,對於像 GWA2Java 這樣默認的 UTF-8 環境,字符集轉碼成爲无可奈何的事件。

6. 文件上傳處理办法的歸置

在 GWA2 的架構設計中,文件上傳性能,歸屬于文件模塊,引入系統的接口文件是 inc/FileA , 針對不同的文件系統,有不同的文件類來實現 inc/FileDirver , 如 默認的文件處理是 Linux 的 inc/FileSystem .

在歸屬上,這些 inc 目錄下的類及其办法是“大家閨秀”,个别不參與到具體業務處理程序的,只能通過統一界面接口 inc/WebApp 來調用。因而现实的是調用文件上傳的邏輯流程大抵為:

ctrl/a.jsp –> mod/ModA –> inc/WebApp –> inc/FileA –> inc/FileSystem .

由於文件上傳,屬於十分規的“操作”需要,另外一種非標準的捷徑是,在 mod/ModA 中间接實例化 inc/FileSystem , 從而便当地觸發對 upload 办法的運用。但這只針對具體的項目可行,且不须要可移植性。比方如果宿主系統不是 Linux, 那就不能實例化 inc/FileSystem , 相應地可能须要實例化 inc/WindowsFileSystem 來處理宿主環境是 Windows 的文件上傳。

7. 有進有出,文件刪除的操作

在此之前,外围接口類 inc/WebApp 中定義了 readObject/writeObject 用來讀寫非數據庫源的數據。其中 inc/FileA 中相應地定義了 read/write 办法,只是還沒有對應的刪除办法 rm 的實現。

接著這個機會,我們歸置並實現了 inc/FileA, inc/FileDriver 和 inc/FileSystem 三個類的 rm 办法,同時革新 inc/WebApp.rmBy 办法,將上述办法進行對接。

inc/WebApp.rmBy(“file:Path_To_File”) –> inc/FileA.rm –> inc/FileSystem.rm .

 GWA2Java, GWA2 就是這樣通過一個又一個項目實踐,不斷豐富欠缺,日益健壯弱小,儅交融和沉澱足夠多的智慧和精華,肯定能获得更大的成就。我們在 UfqiWork 有福工坊 ( https://ufqi.com/work/ )上首先實現了 GWA2Java 處理文件上傳的客貨混裝模式。


-GWA2 吉娃兔 是”通用网络应用架构( General Web Application Architeture, https://ufqi.com/dev/gwa2/ )”,基于 -GWA2 能够轻便构建各种网络应用程序,
包含简单的在线购物商城、在线医疗、在线教育、 游览交易平台、社群或者社交网站和新闻资讯网站等,
也包含各种企事业单位网上门户,在线交互及服务作业系统等.
还能够包含为NativeApp做服务器端反对, 甚至是WebApp的全副.
-GWA2 是为数不多的反对跨开发语言的利用框架,目前反对 -Java, -PHP, -Perl, -Aspx and -Python .

-GWA2 is a “General Web Application Architecture” and based on -GWA2 developers can easily build a variety of network applications,
including complex online shopping malls, online medical services, online teaching, travel trading platforms, community or social networking sites and news information sites, etc.
Also the applications include various online portals of enterprises and institutions, online interaction and service operations systems.
Moreover it contains server-side support for NativeApp, or even all of the WebApp.
-GWA2 is one of the web frameworks which provide cross-language support for -Java, -PHP, -Perl, -Aspx and -Python at present.

-GWA2 is E.A.S.Y
**Easy Along, Swift Yield
**轻松启动, 疾速产出.


有福工坊UfqiWork 是一个在线服务交易平台。( https://ufqi.com/work/ )
有福工坊提供在线分类服务信息,致力于在线撮合服务交易的买方和卖方,并为买方、卖方提供“行准”服务,居间担保服务交易。行准服务的提供方为居间交易的第三方。有福工坊的服务交易平台为整个服务交易流程的第四方。

-R/32ST

GWA2吉娃兔🐇Java中的文件上傳表單處理若干問題

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理