Как проверить, существует ли файл chrome: // с помощью javascript, без фактической загрузки файла? - PullRequest
2 голосов
/ 08 мая 2011

Я использую следующую функцию в расширении Firefox, чтобы проверить, существует ли файл в другом расширении:

function chromeFileExists(fileLoc) // in extension package
{
    var xmlhttp = new window.XMLHttpRequest();
    try {
        xmlhttp.open("GET", "chrome://"+fileLoc, false);
        xmlhttp.send(null);
        var xmlDoc = xmlhttp.responseXML.documentElement;
    }
    catch(ex) {
        return false;
    }
    return true;
} 

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

Как проверить существование и вернуться без загрузки самого файла?Я пытался работать с onreadystatechange, но, похоже, не могу понять.

Ответы [ 3 ]

2 голосов
/ 09 мая 2011

Думаю, я понял это, узнав несколько вещей о том, как обрабатывается этот тип запроса:

  1. Статус для локальных файлов всегда "0" (не 200,и т. д.).

  2. , если async имеет значение true, исключение не будет выдано, если файл не найден.

  3. кажется, что по какой-то причине пропускается readyState 3 - если async имеет значение false, readyState идет прямо к 4.

  4. , если первая частьURL-адрес chrome (имя расширения) не существует, он создает исключение для open().

  5. Если async имеет значение false и файл не существует, он создает исключение для onreadystatechange.

  6. Если async имеет значение false и файл существует, прерывание onreadystatechange останавливает его фактическое чтение файла.

Итак, похоже,go is async = false, прервать после успешного изменения ReadyState (до 4) и вернуть true (файл существует).Если при open или onreadystatechange существует исключение, верните false (не существует).

Вот код, который, по-видимому, прерывается, пока xmlhttp.responseXML все еще null, если файл существует, и выдаетисключение, если это не так:

function chromeFileExists(fileLoc) // in extension package
{
    var xmlhttp = new window.XMLHttpRequest();
    try {
        xmlhttp.open("GET", "chrome://"+fileLoc, false);
        xmlhttp.onreadystatechange=function() {
            xmlhttp.abort();
        }
        xmlhttp.send(null);
    }
    catch(ex) {
        return false;
    }
    return true;
} 
2 голосов
/ 08 мая 2011

Вы можете использовать метод onreadystatechange XMLHTTPRequest и setTimeout. Я на самом деле не пробовал это, но я думаю, что это будет что-то вроде:

var clearhttp = function() {
    xmlhttp.abort();
    fileDoesNotExist = false;
}
xmlhttp.onreadystatechange=function() {
    if (xmlhttp.readyState == 3) {
        setTimeout(clearhttp, 250);
    } else if(xmlhttp.readyState == 4 && xmlhttp.status == 404){
        fileDoesNotExist = true;
    }
}
1 голос
/ 08 мая 2011

а как же:

xmlhttp.open("HEAD", "chrome://"+fileLoc, false);

Возможно, вам проще протестировать, чем мне, поскольку я давно не играл с расширениями, и вы не можете точно запросить chrome:// с обычной страницы:)

...