Flex 客戶端上傳文件至 Java Servlet 時拋出:Error #2044: Unhandled IOErrorEvent: text=Error #2038: File I/O Error。Tomcat 啟動正常,直接訪問 Servlet URL 無異常。
Flex 要求目標服務器根目錄下存在 crossdomain.xml:
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "https://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*" secure="false"/>
<allow-http-request-headers-from domain="*" headers="*" secure="false"/>
</cross-domain-policy>
放置於 Tomcat webapps/ROOT/ 或配置 <Context docBase="..."/> 映射路徑。
檢查 web.xml:
<servlet>
<servlet-name>UploadFile</servlet-name>
<servlet-class>com.example.UploadFile</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadFile</servlet-name>
<url-pattern>/servlet/UploadFile</url-pattern>
</servlet-mapping>
Flex 端 URLRequest 必須精確匹配:https://host:port/context/servlet/UploadFile。
代碼中 private String uploadPath = "d:\\files\\"; 存在三大隱患:
d:\\\\files\\\\ 或 d:/files/./uploads/ 或環境變量注入chown tomcat:tomcat uploads)DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setRepository(new File(System.getProperty("java.io.tmpdir"))); // 關鍵:指定臨時目錄
factory.setSizeThreshold(1024 * 1024); // 1MB 以上寫磁盤
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8"); // 解決中文文件名亂碼
upload.setSizeMax(100 * 1024 * 1024);
Flex DataEvent.UPLOAD_COMPLETE_DATA 要求服務端**必須返回文本**,否則進度條回調不觸發:
response.setContentType("text/plain;charset=UTF-8");
response.getWriter().write("SUCCESS"); // 或 JSON: {"status":"ok","url":"..."}
response.getWriter().flush();
IOErrorEvent.IO_ERROR、HTTPStatusEvent.HTTP_STATUS 監聽器,輸出詳細錯誤碼localhost_access_log 確認請求是否到達、HTTP 狀態碼系統性覆蓋「跨域策略、URL 映射、路徑權限、編碼響應」四大維度,Flex 上傳 IOError #2038 將迎刃而解。