关于flex 和java上传是用FileReference 时候遇到的问题
来源:互联网 发布:unity3d 保存texture 编辑:程序博客网 时间:2024/05/22 14:45
这段时间我们做文件上传,因为是用的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
- 关于flex 和java上传是用FileReference 时候遇到的问题
- flex:使用FileReference上传文件
- flex fileReference的上传下载
- Flex用filereference上传文件firefox下报2038错误
- 在图片上传时候遇到的问题
- 文件上传时候可能遇到的问题
- Flex中利用FileReference类的browse()和upload()函数选择并上传单个文件到Web服务器
- [Flex]FileReference的一个bug!?
- flex filereference+httphandler实现文件上传/下载
- Flex FileReference 上传或下载文件
- FileReference 上传文件,java接收
- Firefox中使用FileReference上传文件的问题:Session丢失
- FileReference URLrequest上传文件的问题:Session丢失
- 关于svn提交时候遇到的问题
- java面试时候遇到的一些问题
- Flex中利用URLVariables和FileReference类Flex向服务器端脚本传送数据的例子
- FileReference.upload的路径问题
- Flex中使用FileReference类多文件上传
- ACM中数论方面题目集
- SDL入门教程(十一):1、SurfaceClass类的再设计
- 蝴蝶兰与鳞托菊
- Codeforces Round #137 (Div. 2)
- Eclipse可以说的秘密
- 关于flex 和java上传是用FileReference 时候遇到的问题
- VS2010连接SQL Server 2008并执行查询操作
- SDL入门教程(十一):2、设计按钮ButtonClass
- SDL入门教程(十一):3、做一个对话框
- Android 内置含有so文件的APK的另一种方式
- Android-----WebView使用知识点总结
- SDL入门教程(十二):音乐和音效
- “另类” 设计模式
- SDL入门教程(十三):1、多线程,从动画说起