加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

关于flex 和java上传是用FileReference 时候遇到的问题

发布时间:2020-12-15 04:48:18 所属栏目:百科 来源:网络整理
导读:这段时间我们做文件上传,因为是用的flex 没有办法和java是用BlazeDS 进行流的通信传递信息,而且一旦文件很大我们内存就必须要足够大, 所以BlazeDS的方式我们必须要放弃的。 采用方案flex+serverlet 方式轻松进行传递。 其中遇到编码问题: 1 是用URLEncod

这段时间我们做文件上传,因为是用的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:Usersyjy.m2repositorycomhuadicscpcommons-fileupload1.2.2commons-fileupload-1.2.2.jar

C:Usersyjy.m2repositorycomhuadicscpcommons-io1.4commons-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,n);
		}
		in.close();
		out.close();
		logger.info("文件下载在客户端时刻:" + System.currentTimeMillis());
		logger.info("Download END.......");
	}

	/***
	 * 设计成为 proxy 统一使用
	 */
	protected void doPost(HttpServletRequest request,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,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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读