Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Upload ByteArray (http://www.flasher.ru/forum/showthread.php?t=123223)

Olban 27.03.2009 15:43

Upload ByteArray
 
Интересует, возможно ли реализовать такое:

Открываем файл c помощью FileReference, считываем с него первых 1000 байт, и загружаем c помощью upload(request);
вот как-то так:
Код AS3:

var fileData:ByteArrayAsset = ByteArrayAsset(file.data);
var part:ByteArray = new ByteArray();
fileData.readBytes(part, 0, 1000);
var request:URLRequest = new URLRequest("save-file.php");
part.upload(request);

Нужно загружать upload-ом, поскольку если использовать load, то нет возможности контролировать отправленные байты, соответсвенно нельзя сделать прелоадр.

BlooDHounD 27.03.2009 16:17

возможно. только первая строчка не будет работать.

Olban 27.03.2009 16:44

Выдает ошибку Call to a possibly undefined method upload through a reference with static type flash.utils:ByteArray.
Хм.. как тогда же подсунуть методу upload бинарные данные?
У меня есть сомнения. upload не позволит подсавить другой тип. Тут нужно, чтобы part был FileReferenc-ом. А перезаписать в file.data тоже не получится, так как оно только для чтения.

BlooDHounD 27.03.2009 16:52

госпади .. да смотрите же что пишите.
с каких пор в FileReference лежит ByteArrayAsset?
откуда у класса ByteArray метод upload?

я такой фигнёй никогда не занимался, но код, должен быть типа такого:
Код AS3:

                function upload(file:FileReference):void {
                        var part:ByteArray = new ByteArray();
                        file.data.readBytes( part, 0, 1000 );
                        var request:URLRequest = new URLRequest( 'save-file.php' );
                        request.method = URLRequestMethod.POST;
                        request.data = part;
                        file.upload( request );
                }


Olban 27.03.2009 17:27

Ступил) с кем не бывает. В твоем коде после строчки file.data.readBytes( part, 0, 10 ); почему-то не происходит отправка методом upload.

BlooDHounD 27.03.2009 17:58

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

wvxvw 27.03.2009 18:14

Цитата:

Сообщение от http://help.adobe.com/en_US/AS3LCR/Flash_10.0/flash/net/FileReference.html#upload()
upload() method
public function upload(request:URLRequest, uploadDataFieldName:String = "Filedata", testUpload:Boolean = false):void
Language Version: ActionScript 3.0
Runtime Versions: AIR 1.0 Flash Player 9
Starts the upload of a file selected by a user to a remote server. [...]

Это значит, что вы не можете отправить произвольные данные - только файл, выбраный пользователем через системный диалог. Если вам нужно отправить данные, которые вы сами скомбинировали - используйте URLLoader / URLStream.

dimarik 27.03.2009 19:17

http://help.adobe.com/ru_RU/AS3LCR/F...uest.html#data
Цитата:

Если объект относится к типу ByteArray, то двоичные данные этого объекта используются в качестве данных POST. Данные типа ByteArray не поддерживаются для метода GET. Вдобавок, данные ByteArray не поддерживаются для FileReference.upload() и FileReference.download().

etc 27.03.2009 19:47

Интересно, что будет, если сделать file.data.length = 1000; и отправить…

BlooDHounD 27.03.2009 20:13

__etc, вероятно то что надо :)

etc 27.03.2009 20:19

А я не знаю, вдруг флеш-плеер супер-пупер умный и скажет, что я такой плохой и править файлы нельзя.
Экспериментировать лень.

Olban 27.03.2009 22:11

Скорее всего скажет, что доступно только для чтения. Хотя все может быть...
Короче все дружно ждем flash11

etc 27.03.2009 22:14

Цитата:

Сообщение от Olban (Сообщение 809043)
Скорее всего скажет, что доступно только для чтения.

С какого перепугу? Даже если это и геттер, ничего не мешает мне изменить контент. Другое дело, является ли этот ByteArray действительным содержанием файла, отправляемым на сервер или же это просто копия.

wvxvw 28.03.2009 00:36

Я думаю, что копии для многомегабайтных файлов было бы очень накладно делать...

etc 28.03.2009 11:42

А их можно и не делать, при upload напрямую бинарник слать и всё.

Olban 29.03.2009 05:26

А если load-ом, то файл копируется в оперативную память. Кстати, как его выгрузить?

djtheme 11.12.2009 19:37

ReferenceError: Error #1074:
 
Цитата:

Сообщение от BlooDHounD (Сообщение 808945)
госпади .. да смотрите же что пишите.
с каких пор в FileReference лежит ByteArrayAsset?
откуда у класса ByteArray метод upload?

я такой фигнёй никогда не занимался, но код, должен быть типа такого:
Код AS3:

                function upload(file:FileReference):void {
                        var part:ByteArray = new ByteArray();
                        file.data.readBytes( part, 0, 1000 );
                        var request:URLRequest = new URLRequest( 'save-file.php' );
                        request.method = URLRequestMethod.POST;
                        request.data = part;
                        file.upload( request );
                }


ReferenceError: Error #1074: Недопустимая запись в свойство "только на чтение" data в flash.net.FileReference.

и к тому же в мануалах http://help.adobe.com/en_US/AS3LCR/F...ence.html#data
ясно сказано:

data:ByteArray [read-only]

etc 11.12.2009 20:31

djtheme, к чему ваш пост? К тому, что вы невнимательно читаете?

kackbip 11.12.2009 22:07

etc, видимо, к тому, что некоторые люди пишут, вещи которых быть не может, не разобравшись в вопросе:
1) FileReference#data - read only
2) FileReference#upload и FileReference#data никак не связаны. data на upload никак не влияет

ПС: Сам я мечтаю о добавлении методов limit и offset в метод FileReference#load

etc 11.12.2009 23:18

kackbip, вы тоже приведенный код не читали?

kackbip 11.12.2009 23:20

Читал. Вы на что-то конкретное хотите указать?

etc 11.12.2009 23:25

Да походу не читали, в том самом приведенном коде как раз тот самый upload, о котором вы мечтаете.

dimarik 12.12.2009 01:36

[offtop]
тсс! всем спать! пусть вам снятся сны о добром, доступным на запись АШДУКУАУКУТСУ.
[/offtop]

bicubic_bublic 12.12.2009 02:03

Нельзя!

kackbip 12.12.2009 09:30

etc, ну что ж такое-то? Да проверено уже не один раз. Сами тоже ведь могли бы и проверить.

Изменения FileReference#data никак не отражаются на данный которые будут отправлены на сервер с помощью FileReference#upload.

Пробовал писать данные в FileReference#data, пробовал менять длину этого массива байт, пробовал выставлять его position - ничто из этого не влияет на загружаемые на сервер данные т.к. файл отправляется не из оперативной памяти, а с диска.

ПС: допуская все таки что я ошибся. Кто укажет мне на мою ошибку? Буду очень рад если etc прав.

etc 12.12.2009 12:48

kackbip, боже мой, кто говорит об отправке именно upload-ом у FileReference? Альтернативный вариант же предложен Блудом.

kackbip 12.12.2009 14:34

etc, хватит нас разыгрывать :)
Вы, похоже, говорите об аплоаде с помощью URLLoader? Да, это решило бы все проблемы в том числе и с безопасностью.

etc 12.12.2009 15:07

Я никого не разыгрывал, код приведен, там URLLoader, загружайте на здоровье.

djtheme 12.12.2009 15:37

Цитата:

Сообщение от etc (Сообщение 872152)
djtheme, к чему ваш пост? К тому, что вы невнимательно читаете?

Да вы правы - невнимательно прочитал, ИЗВИНИТЕ!

Но зато возник вопрос:

когда написать
Код AS3:

function upload(file:FileReference):void {
        file.data.readBytes( part, 0, 1000 );
                ..........
        request.data = part;
        file.upload( request );
}

на сервер будет отправлено и файл и его часть [0..1000] или только часть?

kackbip 12.12.2009 15:46

Это начинает надоедать.
Код AS3:

                function upload(file:FileReference):void {
                        var part:ByteArray = new ByteArray();
                        file.data.readBytes( part, 0, 1000 );
                        var request:URLRequest = new URLRequest( 'save-file.php' );
                        request.method = URLRequestMethod.POST;
                        request.data = part;
                        file.upload( request );
                }

где URLLoader?

Цитата:

на сервер будет отправлено и файл и его часть [0..1000] или только часть?
Будет ошибка т.к. request.data не может быть ByteArray при аплоаде с помощью FileReference

etc 12.12.2009 15:56

kackbip, пардон, URLRequest с URLLoader имелся ввиду.

kackbip 12.12.2009 16:00

etc, вот тут я полностью согласен и поддерживаю, но тут появляется ограничение на размер файла. При исполнении операции FileReference.load, если файл > 500Мб то мой браузер просто экстренно закрывается без предупреждений. Тестировал в ie6,7 и ff3. Тоже самое происходит со средой Flash CS3,4 и stand alone FP.

djtheme 12.12.2009 16:07

Цитата:

Сообщение от kackbip (Сообщение 872292)
Будет ошибка т.к. request.data не может быть ByteArray при аплоаде с помощью FileReference

Ошибки нет, просто эта зараза обрезала ByteArray на первом не ASCII символе :) - только что проверил.

kackbip 12.12.2009 16:22

Интересно. :) Я бы даже сказал - вау! Тоже попробую.

djtheme 12.12.2009 16:47

Цитата:

Сообщение от kackbip (Сообщение 872302)
Интересно. :) Я бы даже сказал - вау! Тоже попробую.

только я не в саму дату запихивал БайтМассив а в один из параметров в URLVars

kackbip 12.12.2009 16:55

А ну тогда воспользуйтесь UploadPostHelper.as и у вас она даже обрезаться перестанет.


Часовой пояс GMT +4, время: 07:44.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.