關於flex 和java上傳是用FileReference 時候遇到的問題

來源:互聯網
上載者:User

這段時間我們做檔案上傳,因為是用的flex 沒有辦法和java是用BlazeDS 進行流的通訊傳遞資訊,而且一旦檔案很大我們記憶體就必須要足夠大,

所以BlazeDS的方式我們必須要放棄的。

採用方案flex+serverlet 方式輕鬆進行傳遞。

其中遇到編碼問題:

1 是用URLEncoding 解決(tomcat的類),

2 遇到flex傳遞過來檔案連頭解釋內容檔案都儲存了,顯然不行,經過查詢很多資料

參見資料:http://help.adobe.com/zh_CN/FlashPlatform/reference/actionscript/3/flash/net/FileReference.html#upload

 POST /handler.cfm HTTP/1.1   Accept: text/*  Content-Type: multipart/form-data;   boundary=----------Ij5ae0ae0KM7GI3KM7   User-Agent: Shockwave Flash   Host: www.example.com   Content-Length: 421   Connection: Keep-Alive   Cache-Control: no-cache    ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7  Content-Disposition: form-data; name="Filename"    MyFile.jpg  ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7  Content-Disposition: form-data; name="Filedata"; filename="MyFile.jpg"  Content-Type: application/octet-stream    FileDataHere  ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7  Content-Disposition: form-data; name="Upload"    Submit Query  ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7--

是這種格式檔案,所以必須要經過解析才能拿到檔案內容,

這個也有想過自己手動寫個解析類,但是分析了下這個結構,貌似不是很好解析啊,所以沒有辦法,但是在一分析,這個結構有點像是apache的開源上傳組件的檔案結構,

org.apache.commons.fileupload.servlet.ServletFileUpload  這個類,

這兩個個包應該是必須的,經過測試果然能用。

C:\Users\yjy\.m2\repository\com\huadi\cscp\commons-fileupload\1.2.2\commons-fileupload-1.2.2.jar

C:\Users\yjy\.m2\repository\com\huadi\cscp\commons-io\1.4\commons-io-1.4.jar

下面是代碼分享,這裡的重點是servlet  之貼出servlet的代碼:

package com.gzhdi.cscp.service;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.DefaultFileItemFactory;import org.apache.commons.fileupload.FileItem;import org.apache.commons.fileupload.FileItemFactory;import org.apache.commons.fileupload.FileUploadException;import org.apache.commons.fileupload.servlet.ServletFileUpload;import org.apache.log4j.Logger;import com.gzhdi.cscp.api.comm.def.CDMIRequestDefine;import com.gzhdi.csmp.gate.DataOperate;@SuppressWarnings("deprecation")public class UpDownFFF extends HttpServlet{private static final long serialVersionUID = 1L;private static final Logger logger = Logger.getLogger(UpDownFFF.class);DataOperate op = new DataOperate(null, null);public static final String METHOD_POST = "POST";public static final String METHOD_GET = "GET";/** * @see HttpServlet#HttpServlet() */public UpDownFFF(){super();}/** * 這裡的意思就是我幫你請求的意思,請求轉寄 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse *      response) */protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{logger.info("Download START.......");String uri = request.getPathInfo();InputStream in = op.httpActionForInputStream(METHOD_GET, uri + "?"+ request.getQueryString(), false);OutputStream out = response.getOutputStream();int n = 0;byte[] b = new byte[1024];while ((n = in.read(b)) != -1){out.write(b, 0, n);}in.close();out.close();logger.info("檔案下載在用戶端時刻:" + System.currentTimeMillis());logger.info("Download END.......");}/*** * 設計成為 proxy 統一使用 */protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{logger.info("Upload START.......");request.setCharacterEncoding("UTF-8");String uri = new String(request.getPathInfo().getBytes("iso8859-1"),"utf-8")+"?"+request.getQueryString();request.getParameter("Upload");InputStream in=null;try{ FileItemFactory filefactory=new DefaultFileItemFactory() ;//解析request body拿出來檔案體ServletFileUpload upload = new ServletFileUpload(filefactory);@SuppressWarnings("unchecked")List<FileItem> fileItems = upload.parseRequest(request);Iterator<FileItem> iter=fileItems.iterator();FileItem fileItem=null;while(iter.hasNext()){fileItem=iter.next();if(!fileItem.isFormField()){in=fileItem.getInputStream();}}} catch (FileUploadException e){e.printStackTrace();}String re = op.proxyHttpAction(METHOD_POST, uri, in,null);OutputStream out = response.getOutputStream();out.write(re.getBytes());out.close();/////////////test//InputStream sendDataStream=request.getInputStream();//int n = 0;//int count=0;//byte[] b = new byte[1024];//while ((n = sendDataStream.read(b)) != -1)//{//count+=n;//System.out.print("recevie:"+new String(b,0,n));//}//logger.info("Upload END.......");}/** * 組裝要求標頭 統一使用 * @param request * @author yinlei |2012-9-3 下午4:21:59 * @version 0.1 */public Map<String, String> getHeaders(HttpServletRequest request){Map<String, String> map = new HashMap<String, String>();String sign = request.getHeader(CDMIRequestDefine.HEADER_SIGN);if (sign != null){map.put(CDMIRequestDefine.QUERY_APPID, sign);}return map;}}

可以參見這個,這個兄弟寫的很詳細,非常感謝:http://www.blogjava.net/rainwindboys/archive/2008/09/18/229219.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.