【心得】Flex中的文件上傳與下載

    和傳統的JSP一樣,在flex中,有的時候也需要實現文件上傳和下載的功能,但是在flex裏文件的上傳和下載的實現相對來說比較複雜,如何實現,請看下面。

    由於flex是一個比較新的技術,在研究的時候,還是按着JSP的方式去嘗試,在開始之初,主要有以下幾種思路:

    A、利用ftp的方式進行文件的上傳和下載,需要利用flex的socket接口。

    B、利用webService的方式來進行文件的上傳和下載

    C、利用flex+sevlet+fileupload組件實現文件的上傳和下載

    在通過比較後,最後選擇了第三種,用Flex+sevlet的方式來完成文件上傳和下載的功能,理由如下(與上面的思路相對應):

    A、涉及到了流的操作,實現起來比較複雜,出現錯誤的機率比較高

    B、關於flex端的可參考的資料比較少,並且還需要啓動webservice服務

    C、這個技術比較成熟,從flex2.0開始,在flex端已經可以引用FileReference類了,並且在java端有成熟的組件可以使用,所以最後考慮使用該種方法來處理。

一、文件的上傳

    1、Flex端
        A、使用到的類介紹:
            FileReference 類提供了在用戶計算機和服務器之間上載和下載文件的方法。 操作系統對話框會提示用戶選擇要上載的文件或用於下載的位置。它主要能實現一個文件的上傳。
            FileReferenceList 類提供了讓用戶選擇一個或多個要上載的文件的方法。 FileReferenceList 對象將用戶磁盤上的一組本地文件(一個或多個文件)表示爲 FileReference 對象的數組。
        B、使用 FileReferenceList 類 實現多文件上傳:
            1) 將該類實例化:var myFileRef = new FileReferenceList(); 
            2) 調用 FileReferenceList.browse() 方法,該方法將打開一個對話框,讓用戶選擇一個或多個要上載的文件:myFileRef.browse(); 
            3) 在成功調用 browse() 方法之後,使用 FileReference 對象數組來填充 FileReferenceList 對象的 fileList 屬性。 
                對 fileList 數組中的每個元素調用 FileReference.upload()

        代碼如下:

    /** *//**
     * 執行上傳操作
     * 
*/
    
    
private function upLoadFiles():void
    
{
        
try
        
{
            selectFileList.browse(
new Array(imageFilter, textFilter));
            selectFileList.addEventListener(Event.SELECT, selectHandler1);
        }

        
catch (error:Error) 
        
{
            Alert.show(
"文件選擇出現錯誤,請選擇正確的文件");
        }

    }

    
/** *//**
     * 如果文件被選中,則執行該方法
     * 
*/

    function selectHandler1(event:Event):
void
    
{
        var request:URLRequest 
= new URLRequest("FileUploadServlet");
        var upLoadFile:FileReference; 
        var upLoadFileList:FileReferenceList 
= FileReferenceList(event.target);
        var selectedFileArray:Array 
= upLoadFileList.fileList;
        login 
=(testPress)(PopUpManager.createPopUp( this, testPress , true));
        
for (var i:uint = 0; i < selectedFileArray.length; i++)
        

            upLoadFile 
= FileReference(selectedFileArray[i]);
            upLoadFile.addEventListener(Event.COMPLETE, UpLoadcompleteHandler);
            upLoadFile.addEventListener(ProgressEvent.PROGRESS, progressHandler); 
            
try
            
{
                upLoadFile.upload(request);
            }

            
catch (error:Error)
            
{
                Alert.show(error.message.toString());
            }

        }

    }

    function UpLoadcompleteHandler(event:Event):
void
    
{
         var upLoadFiles:FileReference 
= FileReference(event.target);
         var fileNames 
= upLoadFiles.name;
         
//Alert.show('文件'+fileNames+'上傳成功')
         login.myLabels.text = '文件'+fileNames+'上傳成功';
    }

     
private function progressHandler(e:ProgressEvent):void
  

    var proc: uint 
= e.bytesLoaded / e.bytesTotal * 100;  
    login.bar.setProgress(proc, 
100);  
    login.bar.label
= "當前進度: " + " " + proc + "%";  
 }
 

testPress.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="528" height="236">
<mx:Script>
    
<![CDATA[
        import mx.managers.PopUpManager;
        public function clickMe():void {
            PopUpManager.removePopUp(this);
        }
    
]]>
</mx:Script>
    
<mx:ProgressBar id="bar" labelPlacement="bottom" themeColor="#F20D7A"  
minimum
="0" visible="true" maximum="100" label="當前進度: 0%"  
direction
="right" mode="manual" width="200" x="154" y="84"/>  
    
<mx:Button x="221" y="135" label="關閉" click = "clickMe();"/>
    
<mx:Label x="173" y="27" id="myLabels" width="157"/>

</mx:TitleWindow>

    2、JAVA端

     接受Flex端的請求,在JAVA端利用apache的fileupload類庫實現上傳功能。代碼如下:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;

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

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

public class FileUploadServlet extends HttpServlet
{

    
// private String uploadPath = "D:\\upload\\";
    private String path = "file_path.properties";
    
private String skStr = "";
    
private String uploadPath = "";
    
private int maxPostSize = 1000 * 1024 * 1024;

    
public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException,
            IOException
    
{
        String filePathaa 
= this.getServletConfig().getServletContext().getRealPath("/");

        Properties p 
= loadProperties(path);

        uploadPath 
= p.getProperty("filepath");

        res.setContentType(
"text/html;charset=UTF-8");
        req.setCharacterEncoding(
"UTF-8");

        DiskFileItemFactory factory 
= new DiskFileItemFactory();
        factory.setSizeThreshold(
1024*20);

        ServletFileUpload upload 
= new ServletFileUpload(factory);
        upload.setSizeMax(maxPostSize);
        
try
        
{
            List fileItems 
= upload.parseRequest(req);
            Iterator iter 
= fileItems.iterator();
            
while (iter.hasNext())
            
{
                FileItem item 
= (FileItem) iter.next();
                
if (!item.isFormField())
                
{
                    String name 
= item.getName();

                    
try
                    
{
                        File skFile 
= new File(uploadPath + name);
                        
if (skFile.exists())
                        
{
                            skFile.delete();
                            item.write(
new File(uploadPath + name));

                        }

                        
else
                        
{
                            item.write(
new File(uploadPath + name));
                        }


                    }
 catch (Exception e)
                    
{
                        e.printStackTrace();
                    }

                }

            }

        }
 catch (FileUploadException e)
        
{
            e.printStackTrace();
        }


    }


    
public Properties loadProperties(String path) throws IOException
    
{

Images
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章