Загрузка нескольких изображений не работает - PullRequest
0 голосов
/ 30 декабря 2011

Я пытаюсь создать загрузчик нескольких изображений (например, 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 выше?

Ответы [ 2 ]

0 голосов
/ 02 января 2012

Вот несколько действий для загрузки одной фотографии - адаптируйте ее под свои нужды. 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>";
?>
0 голосов
/ 02 января 2012

Не уверен, что это ошибки, но вот некоторые мысли:

Можно ли выяснить, использует ли fileRef.browse() тот же объект, что и объект file, который выполняет загрузку?

Добавить прослушиватель событий перед началом загрузки:

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

И этот пост может иметь какое-то отношение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...