Полезная информация

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

№112-12-2008 16:05:54

Cristian
Участник
 
Группа: Members
Зарегистрирован: 07-12-2008
Сообщений: 8
UA: Opera 9.2

отследить загрузку файла

Суть такая: я скачаваю с удаленного сервера несколько файлов и сохраняю их во временной папке. Затем, мне нужно прочитать эти файлы и получить их содержимое для последующей обработки.

Проблема в том, что при выполнении метода main, файл не успевает сохраниться к моменту, когда его пытается прочитать функция getFileSource().

Можно ли, как-то, приостановить выполнение дальнейших конструкций, пока файл не будет полностью получен и сохранен?

Вот примерный скрипт:

Выделить код

Код:

var obj = {

    main : function () {
        var url1 = 'http://site.ru/image1.jpg';
        var url2 = 'http://site.ru/image2.jpg';
        var result = true;
        
        var file1 = null;
        if (url1) {                
            file1 = this.downloadFile(url1, 'image1.jpg');
        }
        
        var file2 = null;
        if (url2) {                
            file2 = this.downloadFile(url2, 'image2.jpg');
        }
        
        if (result) {
            var fileData = '';
            var fileName = 'data.txt';

            if (file1)
                fileData += this.getFileSource(file1, 1);

            fileData += '-----';
            
            if (file2)
                fileData += this.getFileSource(file2, 1);

            alert(fileData);
        }
    },
    
    downloadFile : function (url, fileName) {
        var ios     = Components.classes['@mozilla.org/network/io-service;1']
                                .createInstance(Components.interfaces.nsIIOService);
        var getFile = ios.newURI(url, null, null);
        var newFile = Components.classes['@mozilla.org/file/local;1']
                                .createInstance(Components.interfaces.nsILocalFile);
        var tmp     = Components.classes['@mozilla.org/file/directory_service;1']
                                .createInstance(Components.interfaces.nsIProperties)
                                .get('TmpD', Components.interfaces.nsIFile);
         
        newFile.initWithPath(tmp.path);
        newFile.appendRelativePath(fileName);

        if(!newFile.exists()) 
            newFile.create(0x00, 0666);

        var wbp = Components.classes['@mozilla.org/embedding/browser/nsWebBrowserPersist;1']
                            .createInstance(Components.interfaces.nsIWebBrowserPersist);
        
        wbp.saveURI(getFile, null, null, null, null, newFile);
        
        return newFile;
    },
    
    getFileSource : function (file, onDelete) {
        var fis = Components.classes['@mozilla.org/network/file-input-stream;1']
                            .createInstance(Components.interfaces.nsIFileInputStream);
        var bis = Components.classes['@mozilla.org/binaryinputstream;1']
                            .createInstance(Components.interfaces.nsIBinaryInputStream);
        
        fis.init(file, 0x01, 0444, 0); 
        bis.setInputStream(fis);
        var data = bis.readBytes(file.fileSize);
        bis.close();
        fis.close();
        
        if (onDelete) {
            file.remove(0);
        }
        
        return data;
    }
    
}

Отсутствует

 

№212-12-2008 17:49:23

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 3.0
Веб-сайт

Re: отследить загрузку файла

У nsIWebBrowserPersist есть поле nsIWebProgressListener progressListener
То есть, на wbp можно повесить listener
Думаю, может помочь.


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№312-12-2008 19:01:17

Cristian
Участник
 
Группа: Members
Зарегистрирован: 07-12-2008
Сообщений: 8
UA: Opera 9.2

Re: отследить загрузку файла

Ммм, хорошо. Допустим, я повешу на wbp слушателя. Но как сделать, чтобы дальший код в main не выполнялся, пока файл не загрузится?

Отсутствует

 

№412-12-2008 19:04:56

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 3.0
Веб-сайт

Re: отследить загрузку файла

Переместить код из main в нужный метод listener'а. Пусть listener по окончании загрузки вызывает getFileSource.


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№512-12-2008 21:33:27

Cristian
Участник
 
Группа: Members
Зарегистрирован: 07-12-2008
Сообщений: 8
UA: Opera 9.2

Re: отследить загрузку файла

Пусть listener по окончании загрузки вызывает getFileSource.

Да, но для этого надо как-то перехватить возвращаемый downloadFile() объект сохраненного файла.

Отсутствует

 

№613-12-2008 14:42:04

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 3.0
Веб-сайт

Re: отследить загрузку файла

Можно попробовать так: http://pastebin.mozilla-russia.org/93582


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№713-12-2008 15:26:03

Cristian
Участник
 
Группа: Members
Зарегистрирован: 07-12-2008
Сообщений: 8
UA: Opera 9.2

Re: отследить загрузку файла

При попытке прочитать файл с помощью getFileSource выдает ошибку:

Выделить код

Код:

Ошибка: uncaught exception: [Exception... "Component returned failure code: 0x80520015 
(NS_ERROR_FILE_ACCESS_DENIED) [nsIBinaryInputStream.readBytes]"  nsresult: 
"0x80520015 (NS_ERROR_FILE_ACCESS_DENIED)"  location: 
"JS frame :: chrome://myext/content/myext.js :: anonymous :: line 417"  data: no]
Выделить код

Код:

417. var data = bis.readBytes(file.fileSize);

Возможно, нужно как-то разблокировать файл? В документации по этому поводу ничего не нашел.

Отредактировано Cristian (13-12-2008 15:27:14)

Отсутствует

 

№813-12-2008 17:31:56

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 3.0
Веб-сайт

Re: отследить загрузку файла

При попытке прочитать файл с помощью getFileSource выдает ошибку:

Рискну предположить, что это для второго url, файл для которого не создаётся.

Поэкспериментировал - nsIWebProgressListener в этом случае не помогает.

Вот ещё есть такая идея: http://pastebin.mozilla-russia.org/93590

Хотя, по-моему, должна быть и другая, более правильная.


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№916-06-2013 16:24:16

lostandleft1
Участник
 
Группа: Members
Зарегистрирован: 05-10-2012
Сообщений: 51
UA: Firefox 18.0

Re: отследить загрузку файла

Не нашел более подходящей темы, но чтобы не плодить линее, решил запостить тут:

Почему-то на каком-то этапе FF перестал читать данные из файла скриптом.
Сейчас у меня вылетает ошибка

[object XrayWrapper [object Window]]

Если использовать код, подскажите как победить эту напасть, нужно данные из файла прочитать скриптом и в переменную загнать.

Выделить код

Код:

function toUnicode(charset, data){
var uniConv = Components.classes['@mozilla.org/intl/scriptableunicodeconverter'];
uniConv = uniConv.createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
uniConv.charset = charset;
data = uniConv.ConvertToUnicode(data);
return data;
 };

var conv = Components.classes["@mozilla.org/network/protocol;1?name=file"];
conv = conv.createInstance(Components.interfaces.nsIFileProtocolHandler);
var url ="file:\\\D:\\file.txt";
var file = conv.getFileFromURLSpec(url);

var file_size=file.fileSize; 

var stream;
stream = Components.classes["@mozilla.org/network/file-input-stream;1"];
stream = stream.createInstance(Components.interfaces.nsIFileInputStream);
stream.init(file, 1, 0,0);

var s2 = Components.classes["@mozilla.org/scriptableinputstream;1"];
s2 = s2.createInstance(Components.interfaces.nsIScriptableInputStream);
s2.init(stream);

var content = null;
content = s2.read(file_size);
stream.close();

str=toUnicode("windows-1251",content.toString());

alert(str);

Отредактировано lostandleft1 (16-06-2013 16:25:31)

Отсутствует

 

№1013-12-2013 16:54:58

InfSub
iMacroModer
 
Группа: Moderators
Откуда: DeepTown
Зарегистрирован: 13-05-2013
Сообщений: 3319
UA: Chrome 31.0
Веб-сайт

Re: отследить загрузку файла

lostandleft1 пишет

Не нашел более подходящей темы, но чтобы не плодить линее, решил запостить тут:

Почему-то на каком-то этапе FF перестал читать данные из файла скриптом.
Сейчас у меня вылетает ошибка

[object XrayWrapper [object Window]]

Если использовать код, подскажите как победить эту напасть, нужно данные из файла прочитать скриптом и в переменную загнать.

...

lostandleft1, та же проблема, ты случаем не нашел как ее решить?


Правила форума iMacros for Firefox
Мини FAQ по iMacros for Firefox


на почту, только с интересными предложениями по скриптам (iMacros/iMacros+JS)!

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]