Загрузка файлов Adobe AIR / Flex на сервер, требующий базовой аутентификации - PullRequest
1 голос
/ 13 октября 2010

Ссылка Adobe специально указывает на это как на ограничение.

Вот примечание в функции file.upload в справочнике Adobe.

Примечание. Если вашему серверу требуется аутентификация пользователя, только SWF-файлы, запущенные в браузере, то есть с использованием плагина браузера или элемента управления ActiveX, могут предоставить диалоговое окно для запроса имени пользователя и пароля для аутентификации, и только для скачивания. При загрузке с использованием подключаемого модуля или элемента управления ActiveX или при загрузке и загрузке с использованием автономного или внешнего проигрывателя передача файла завершается неудачей.

нажмите здесь для полной справочной страницы для файла

Кто-нибудь мог обойти это ограничение. Одна мысль у меня была в том, чтобы использовать встроенную поддержку в AIR для Javascript и посмотреть, что работает. Кто-нибудь пробовал это? У кого-нибудь есть другие идеи?

Я также попробовал предлагаемое решение здесь , и оно не сработало. По словам опрашивающего на форуме, похоже, он тоже не работает. Вероятно, проблема вышеупомянутого ограничения / ограничения.

Я понимаю, как включить базовую аутентификацию в URLRequest, и это прекрасно работает для меня, если я публикую пары ключ / значение. Но когда я пытаюсь загрузить файл, он не работает. Он просто сидит там и не запускает никаких событий file.upload. Нет ошибок, нет прогресса. Любая помощь очень ценится.

Вот мой пример кода:

            var sendVars:URLVariables = new URLVariables();
        sendVars.prop1 = "filename" ;

        var urlRequest:URLRequest = new URLRequest();
        urlRequest.method = URLRequestMethod.POST ;
        urlRequest.data = sendVars ;

        var encoder:Base64Encoder = new Base64Encoder();
        encoder.encode("user:pass"); 
        var credsHeader:URLRequestHeader = new URLRequestHeader("Authorization", "Basic " + encoder.toString());            

        urlRequest.requestHeaders.push(credsHeader); 

        file = new File(url);

        file.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA , file_UploadCompleteDataHandler );            
        file.addEventListener( Event.OPEN, fileOpenHandler);
        file.addEventListener(ProgressEvent.PROGRESS, fileProgressHandler);
        file.addEventListener(Event.COMPLETE, file_CompleteHandler);
        file.addEventListener(IOErrorEvent.IO_ERROR, file_IOErrorHandler);
        file.addEventListener(HTTPStatusEvent.HTTP_STATUS , file_HTTPStatusHandler);
        file.addEventListener(SecurityErrorEvent.SECURITY_ERROR, file_SecurityErrorHandler);

        try {
            // Start the file upload
            file.upload(urlRequest, "primaryFile", false);
        }
        catch (error:Error) {
            trace( "Unable to upload file." + file.name);
        }

1 Ответ

3 голосов
/ 13 октября 2010

Делайте в точности то, что вы делаете, за исключением получения file.data и передачи его в это ....

    public static function prepareWithFormData(vars:MetadataList, bytes:ByteArray, fieldName:String, filename:String, request:URLRequest):void {
        bytes.position = 0;
        var boundary: String = '---------------------------' + UIDUtil.createUID();
        var header1: String  = "";
        var varsArray:Array = vars.asArray();
        for each(var item:Metadata in varsArray) {
            header1 += "\r\n--" + boundary + "\r\n";
            header1 += 'Content-Disposition: form-data; name="' + item.name + '"\r\n\r\n';
            header1 += item.value;
        }

        header1 += '\r\n--'+boundary + '\r\n'
                +'Content-Disposition: form-data; name="' + fieldName + '"; filename="'+filename+'"\r\n'
                +'Content-Type: application/octet-stream\r\n\r\n'
        //In a normal POST header, you'd find the image data here
        var header2:String =    '\r\n--'+boundary + '--';

        //Encoding the two string parts of the header
        var headerBytes1: ByteArray = new ByteArray();
        headerBytes1.writeMultiByte(header1, "ascii");

        var headerBytes2: ByteArray = new ByteArray();
        headerBytes2.writeMultiByte(header2, "ascii");

        //Creating one final ByteArray
        var sendBytes: ByteArray = new ByteArray();
        sendBytes.writeBytes(headerBytes1, 0, headerBytes1.length);
        sendBytes.writeBytes(bytes, 0, bytes.length);
        sendBytes.writeBytes(headerBytes2, 0, headerBytes2.length);

        request.data = sendBytes;
        request.method = URLRequestMethod.POST;
        request.contentType = "multipart/form-data; boundary=" + boundary;
    }
...