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

Ссылка 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);
        }

person Saviz    schedule 13.10.2010    source источник


Ответы (1)


Делайте именно то, что делаете, кроме получения файла 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;
    }
person optimuspaul    schedule 13.10.2010
comment
Вы хотите сказать, что я должен делать именно то, что делаю с URLRequest, но вместо использования file.upload я должен сделать это: - person Saviz; 13.10.2010
comment
Извините, последний комментарий был отключен до того, как я закончил с ним: вы говорите, что я должен делать именно то, что делаю с URLRequest, но вместо использования file.upload я должен использовать URLRequest и заполнить его .data, как вы предлагаете здесь. Как мне в итоге отправить, если не через файл .upload. Какой загрузчик использовать? - person Saviz; 13.10.2010