>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >отследить загрузку файла http://forum.mozilla-russia.org/viewtopic.php?id=28470 |
Cristian > 12-12-2008 16:05:54 |
Суть такая: я скачаваю с удаленного сервера несколько файлов и сохраняю их во временной папке. Затем, мне нужно прочитать эти файлы и получить их содержимое для последующей обработки. Проблема в том, что при выполнении метода 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; } } |
Anton > 12-12-2008 17:49:23 |
У nsIWebBrowserPersist есть поле nsIWebProgressListener progressListener |
Cristian > 12-12-2008 19:01:17 |
Ммм, хорошо. Допустим, я повешу на wbp слушателя. Но как сделать, чтобы дальший код в main не выполнялся, пока файл не загрузится? |
Anton > 12-12-2008 19:04:56 |
Переместить код из main в нужный метод listener'а. Пусть listener по окончании загрузки вызывает getFileSource. |
Cristian > 12-12-2008 21:33:27 |
Да, но для этого надо как-то перехватить возвращаемый downloadFile() объект сохраненного файла. |
Anton > 13-12-2008 14:42:04 |
Можно попробовать так: http://pastebin.mozilla-russia.org/93582 |
Cristian > 13-12-2008 15:26:03 |
При попытке прочитать файл с помощью 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] Возможно, нужно как-то разблокировать файл? В документации по этому поводу ничего не нашел. |
Anton > 13-12-2008 17:31:56 |
Рискну предположить, что это для второго url, файл для которого не создаётся. Поэкспериментировал - nsIWebProgressListener в этом случае не помогает. Вот ещё есть такая идея: http://pastebin.mozilla-russia.org/93590 Хотя, по-моему, должна быть и другая, более правильная. |
lostandleft1 > 16-06-2013 16:24:16 |
Не нашел более подходящей темы, но чтобы не плодить линее, решил запостить тут: Почему-то на каком-то этапе FF перестал читать данные из файла скриптом.
Если использовать код, подскажите как победить эту напасть, нужно данные из файла прочитать скриптом и в переменную загнать. Выделить код Код: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); |
InfSub > 13-12-2013 16:54:58 |
lostandleft1 пишет
lostandleft1, та же проблема, ты случаем не нашел как ее решить? |