2011-12-30 81 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>"; 
?>