2011-12-30 132 views
0

我試圖創建一個多圖像上傳(認爲Coppermine),其中用戶點擊一個SWF按鈕,選擇一個文件或多個文件,然後這些文件上傳到一個目錄。多個圖像上傳不工作

我有一個處理上傳文件的PHP腳本,我的Flash文件迭代FileReferenceList中的文件並將文件發送到此PHP腳本上傳。在PHP腳本的目錄路徑是正確的,權限設置爲777。

我的ActionScript 3.0類看起來像這樣的內容:

package com.yourfightsite.imageupload { 

    import flash.display.MovieClip; 
    import flash.events.Event; 
    import flash.events.IOErrorEvent; 
    import flash.events.MouseEvent; 
    import flash.events.ProgressEvent; 
    import flash.external.ExternalInterface; 
    import flash.net.FileFilter; 
    import flash.net.FileReference; 
    import flash.net.FileReferenceList; 
    import flash.net.URLRequest; 

    public class ImageUpload extends MovieClip { 

     private var uploadURL:URLRequest; 
     private var fileRef:FileReferenceList; 

     public function ImageUpload():void { 
      uploadURL = new URLRequest(); 
      uploadURL.url = stage.loaderInfo.parameters.uploadUrl; 

      fileRef = new FileReferenceList(); 

      uploadButton.addEventListener(MouseEvent.CLICK, buttonClickHandler); 
     } 

     private function buttonClickHandler(e:MouseEvent):void { 
      var imageFilter:FileFilter = new FileFilter('Images', '*.jpg'); 
      fileRef.browse(new Array(imageFilter)); 
      fileRef.addEventListener(Event.SELECT, fileSelectHandler); 
     } 

     private function fileSelectHandler(e:Event):void { 
      for each(var fileToUpload:FileReference in fileRef.fileList) { 
       addFileToQueue(fileToUpload.name); 
       uploadSingleFile(fileToUpload); 
      } 
     } 

     private function uploadSingleFile(file:FileReference):void { 
      file.upload(uploadURL); 
      file.addEventListener(Event.COMPLETE, completeHandler); 
     } 

     private function ioErrorHandler(e:IOErrorEvent):void { 
      trace('ioErrorHandler: ' + e); 
      ExternalInterface.call('console.error', e); 
     } 

     private function progressHandler(e:ProgressEvent):void { 
      var fileRef:FileReference = FileReference(e.target); 
      var percentUploaded:Number = Math.round((e.bytesLoaded/e.bytesTotal)*100); 
      updateFileInQueue(e.target.name, percentUploaded); 
     } 

     private function completeHandler(e:Event):void { 
      markFileInQueueAsComplete(e.target.name); 
     } 

     private function addFileToQueue(filename:String):void { 
      ExternalInterface.call('addFileToQueue', filename); 
     } 

     private function updateFileInQueue(filename:String, percent:Number):void { 
      ExternalInterface.call('updateFileInQueue', filename, percent); 
     } 

     private function markFileInQueueAsComplete(filename:String):void { 
      ExternalInterface.call('markFileInQueueAsComplete', filename); 
     } 
    } 
} 

在火類的JavaScript函數底部的三種方法在我的HTML頁面中,將文件名添加到文件隊列小部件,並更新它們旁邊的百分比值,最後將它們標記爲完整。

但是,當我選擇文件時,它們按預期方式被添加到文件隊列小部件,然後什麼也不是。文件未上傳,文件隊列小部件中的文件不會更新,並且在發佈我的電影時不會在控制檯(我使用Chrome)或Flash中拋出錯誤。

任何人都可以看到我上面的ActionScript中的任何錯誤?

+0

它能做什麼?你有沒有嘗試在你的動作腳本中放置簡單的TRACE(「HERE(fn name)」)來查看哪些函數正在發射以及按照什麼順序?另外 - 爲什麼你去Flash - > Java腳本 - > PHP?爲什麼不跳過JavaScript? – ethrbunny 2012-01-01 22:22:31

+0

我不是Flash程序員,我的主要熟練程度是PHP,所以上述課程通過各種網站和書籍作爲參考/資源進行組合。 – 2012-01-02 13:48:34

回答

0

不知道這些都是錯誤的,但這裏有一些想法:

是否有可能找出是否fileRef.browse()是使用相同的對象file對象不上傳?

開始上傳之前添加事件偵聽器:

private function uploadSingleFile(file:FileReference):void { 
    file.addEventListener(Event.COMPLETE, completeHandler); 
    file.upload(uploadURL); 
} 

而且this post可能有一定的關聯。

0

下面是一些上傳單張照片的動作 - 根據您的需要進行調整。 PHP如下。

private function onUploadCompleteData (event : DataEvent) : void 
{ 
    var resultXML : XML = new XML(event.data); 
    if (resultXML == null) return; 

    var storednameString : String = resultXML..filename[0]; 


}    

private function uploadPicture() : void 
{ 
    uploadFileReference = new FileReference(); 
    uploadFileReference.addEventListener(Event.SELECT, onSelectFile, false, 0, true ); 
    uploadFileReference.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, onUploadCompleteData, false, 0, true ); 
    uploadFileReference.addEventListener(IOErrorEvent.IO_ERROR, onUploadError, false, 0, true ); 

    uploadFileReference.browse(); 

} 

private function onUploadError(event : IOErrorEvent) : void 
{ 
    Alert.show("Unable to upload picture.", "Photo"); 
}  

private function onSelectFile(event : Event) : void 
{ 
    try 
    { 
     // this is where you pass stuff to PHP - file info, storage info 
     var urlParams : URLVariables = new URLVariables(); 
     urlParams.some_info = some_info; 
     urlParams.sessionId = phpsessionId; 


     uploadURL = new URLRequest(); 

     // this is where you'd put the URL for your server 
     uploadURL.url = serverpathString + "/php/uploadPhoto.php"; 

     uploadURL.method = URLRequestMethod.POST; 
     uploadURL.data = urlParams; 

     uploadFileReference.upload(uploadURL); 
    } 
    catch (error : Error) 
{ 
     Alert.show("Unable to upload file.", "Photo"); 
    }    
}   


<mx:Form height="100%">  
    <mx:Button label="Select" click="uploadPicture()"/>   
</mx:Form> 

PHP上傳文件:

<?php 

    // there is a bug in the flex upload code where the session id isn't being sent. This is a patch for that. 
    session_id($_REQUEST[ 'sessionId' ]); 
    $some_info = $_REQUEST[ 'some_info' ]); 

    session_start(); 

    $maxSize = 1024 * 1000; // 1 Mb 
    if ($_FILES[ 'Filedata' ][ 'size' ] > $maxSize) 
    { 
      echo "<ret/>"; 
      return; 
    } 

    $filename_inbound = $_FILES[ 'Filedata' ][ 'tmp_name' ]; 

    $utc = microtime(true); 

    move_uploaded_file($filename_inbound, "/data/pictures/$filename"); 

    // if you change the stored filename - here is where it gets returned to actionscript 
    // return success/fail the same way 
    echo "<ret><filename>$filename</filename></ret>"; 
?>