注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Flex 技术博客

醉里挑灯看剑,梦回吹角连营

 
 
 

日志

 
 

Get FileReference return data after complete upload  

2009-04-29 16:49:51|  分类: Flex 应用 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

这篇文章讲述的是如何利用FileReference实现文件的上传,并得到后台的返回值。

在Flex中,我们经常会用到FileReference来上传文件,然而以前比较郁闷的是FileReference没有返回值,我们只能得到文件是否上传成功了,却不能得到后台返回的值。

最近重新又碰到这个问题,google了一下,发现Adobe在Flash Player 9.0.28.0之后的版本中支持了一个叫UPLOAD_COMPLETE_DATA 的事件。通过这个事件,我们可以得到后台主要是servlet的返回值。

我这里提供的例子是用Java Servlet作为后台服务,在网上搜了半天也没找到,只好自己写。

先看Flex 端代码:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
    <![CDATA[
    public var file:FileReference;
   
    public function selectFile():void
    {
        file = new FileReference();
        file.addEventListener(Event.SELECT, fileSelected);
        file.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, uploadDataComplete);
        file.addEventListener(Event.COMPLETE, uploadComplete);
        file.addEventListener(IOErrorEvent.IO_ERROR, handleError);
        file.browse();
    }   
    public function handleError(event:IOErrorEvent):void
    {
        status_txt.text = 'ERROR: ' + event.text + '';
    }
    public function fileSelected(event:Event):void
    {
        file = FileReference(event.target);
        file_txt.text = file.name;
        status_txt.text = 'upload file: '+ file.name  + '';       
        var request:URLRequest = new URLRequest();
        request.url = "http://cn-pc-hz2166:9080/UploadServlet";
        var headerVariables:URLVariables = new URLVariables();
        headerVariables.fileName = file.name;
        request.data = headerVariables;
        request.method = URLRequestMethod.POST;
        file.upload(request,"Filedata");           
    }   
    public function uploadDataComplete(event:DataEvent):void
    {
        var result:XML = new XML(event.data);
        status_txt.text += 'Upload Data Complete'
        status_txt.text += 'RESULT: ' + result.toString()  + ''
    }
   
    public function uploadComplete(event:Event):void
    {
        status_txt.text += 'Upload complete';

    }
    ]]>
</mx:Script>
<mx:VBox>
    <mx:TextInput id="file_txt"/>
    <mx:Button id="select_btn" label="select" click="selectFile();"/>
    <mx:TextArea id="status_txt" width="400" height="200"/>
</mx:VBox>
</mx:Application>

后台Servlet要自己写,注意URL的正确性。注意看红色粗体部分代码,简单的很。

Servlet代码:后台代码千万要注意的是要用response的字符流response.getWriter()返回数据到前台,而不能用字节流response.getOutputStream()返回数据到前台,否则前台会乱码,这个可是血的教训啊,我试了很多次,才发现这个问题。这个servlet简单的返回一个xml字符串。

要实现真正上传功能可以参考其他文献,但这里用到了第三方的upload包,为了demo可以考虑注释掉部分代码。

package com.my.servlet;

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
 * Servlet implementation class for Servlet: UploadServlet
 *
 */
 public class UploadServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
    /* (non-Java-doc)
     * @see javax.servlet.http.HttpServlet#HttpServlet()
     */
    public UploadServlet() {
        super();
    }      
   
    /* (non-Java-doc)
     * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }     
   
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/xml;charset=UTF-8");
        PrintWriter writer = response.getWriter();
        try {
            String fileName = "";           
            String status="";
            boolean isMultipart = FileUpload.isMultipartContent(request);           
            String msg = null;
            byte[] img=null;
            InputStream uploadStream = null;
            //only for publish new report
            if (isMultipart) {
                // Create a factory for disk-based file items
                FileItemFactory factory = new DiskFileItemFactory();
                // Create a new file upload handler
                ServletFileUpload upload = new ServletFileUpload(factory);
                // Parse the request
                List items = null;
                try {
                    items = upload.parseRequest(request);
                } catch (Exception e) {
                    msg = "Can not parse the request to upload file.";
                }
                // Process the uploaded items
                Iterator iter = items.iterator();
                while (iter.hasNext()) {
                    FileItem item = (FileItem) iter.next();
                    if (item.isFormField()) {                       
                        if(item.getFieldName().equalsIgnoreCase("fileName")){
                            fileName = item.getString();
                        }else if(item.getFieldName().equalsIgnoreCase("status")){
                            status = item.getString();
                        }
                        continue;                       
                    }else{
                        uploadStream = item.getInputStream();
                    }
                }
                fileName = fileName.substring(0,fileName.indexOf("."));
                int length = uploadStream.available();
                img = new byte[length]; // To hold file contents
                uploadStream.read(img);                           
                //upload the img to server
                //......
               
                //return the string
                String result="<root><status>S</status><fileName>"+fileName+"</fileName></root>";
                writer.print(result);
            }
        }  catch (Exception e) {
            e.printStackTrace();
        } finally{
            writer.flush();
            writer.close();
        }
    }                
}


  评论这张
 
阅读(2764)| 评论(5)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017