xmlhttprequest для локальных файлов - PullRequest
24 голосов
/ 07 октября 2011

У меня есть путь к файлу, который я хочу отправить на остальную веб-службу сервера. Я использую объект xmlhttprequest. Пост выглядит следующим образом:

var url = "http://localhost:8080/RestWSGS/jersey/gridsense";
 var boundary = "--------------" + (new Date).getTime();
  xmlHttp.open('POST', url, true);
  xmlHttp.onreadystatechange = function ()
  {
      if (this.readyState != 4)
        return;

      var result =this.responseText;
    document.write(result);
    };
  xmlHttp.setRequestHeader('Content-Type', 'multipart/form-data; boundary=' + boundary);

var  part ="";
 part += 'Content-Disposition: form-data; ';
  part += 'name="' + document.getElementById("filename").name + '" ; ';
  //alert(document.getElementById("filename").value);
  part += 'filename="'+ document.getElementById("filename").value +  '";\r\n';

  part += "Content-Type: application/xml";
  part += "\r\n\r\n"; // marks end of the headers part
  part += 'filename="'+ document.getElementById("filename").value +  '";\r\n';
  part+= data;
   var request = "--" + boundary + "\r\n";
  request+= part /* + "--" + boundary + "\r\n" */;
  request+= "--" + boundary + "--" + "\r\n";
  alert(request); 
  xmlHttp.send(request);  

Данные, которые я хочу отправить, находятся на локальном диске клиента. Я хочу использовать для этого метод get:

var str = document.getElementById("filename").value;


    var data;
    var xmlhttp1 = getNewHTTPObject();
    xmlhttp1.open("GET", 
    "file:///New Folder/" +document.getElementById("filename").value , false);

    xmlhttp1.send(null);
    alert('hi' + xmlhttp1.status);
    xmlhttp1.onreadystatechange = function()    {
        if (this.status == 0)
        {
            alert("resp " + this.responseText);
            data = this.responseText;
        }
    }

Файл: // не работает. Если я положу свой файл в каталог клиента и удалим файл: ///, тогда я смогу по крайней мере увидеть открытие xmlhttprequest и присвоить ему статус 200 (я думаю, хорошо !!). Я прочитал это для проверки статуса локального файла == 0 вместо readystatus == 4, поэтому я сделал это, но он по-прежнему выдает переменную данных как неопределенную, и поэтому файл не отправляется на сервер. Первоначально, когда я дал форму действий в качестве URL-адреса моего отдыха, он загружался нормально. Поскольку я не использую html5, я не могу получить объект File из элемента input type = file. Я хочу использовать объект xmlhttprequest для этого вместо элемента формы напрямую. Пожалуйста, помогите мне с этой проблемой с любыми предложениями или подсказками Кавита


Даже если я выполняю загрузку с использованием отправки формы, как я могу использовать возвращаемое значение веб-службы. Вот почему мне нужно использовать xmlhttpRequest. Если кто-нибудь может подсказать, как используется возвращаемое значение из действия, это будет здорово !! Kavita

Ответы [ 3 ]

22 голосов
/ 16 июня 2012

Исторически, вы не можете запрашивать локальные файлы из JavaScript (или не должны быть разрешены, или что-то странное).Это было бы серьезным нарушением безопасности.

Есть только несколько обстоятельств, когда вы можете сделать это, но в целом они включают в себя определенные параметры безопасности, которые необходимо установить для вашего браузера, чтобы снять ограничение илиуведомить процесс выполнения текущей страницы о том, что ему предоставлено это исключительное право.Это, например, выполнимо в Firefox путем редактирования свойств.Также нормально при разработке расширений браузера (например, для Chrome или FF), если они запрашивают разрешения на доступ к файлу.

Другой способ обойти это ограничение - разместить локальный веб-сервер и объявить виртуальныйхосты на нем, чтобы иметь возможность делать такого рода AJAX-запрос на выборку локальных файлов.Веб-разработчики довольно часто прибегают к этой уловке (больше похожей на стандарт, на самом деле), чтобы использовать преимущества локальной разработки, но в то же время копировать производственную систему.Например, вы могли бы использовать легкий веб-сервер, такой как Jetty.

(Еще одно неприятное раздражение, с которым вы столкнулись, это то, что некоторые браузеры - по крайней мере, некоторые относительно старые версии FF, такие как 3.6.x - иногда возвращает положительный код ошибки, например, 200, когда их запросы блокируются в соответствии с их внутренними политиками безопасности. Может на некоторое время сбить с толку ...).

Наконец, новые API-интерфейсы HTML5предоставить некоторые новые конструкции для доступа к локальным файлам.С учетом чтения:

Другие вопросы SO также содержат дополнительные указатели:

4 голосов
/ 27 февраля 2014

Я использую iframe.

<div class="item" onclick="page(event)">HTML5</div>

<iframe id="page" src="">
function page(e) {
    trigger = e.currentTarget.innerHTML;
    docname = new String(trigger + ".txt");
    document.getElementById("page").src = docname;
}
0 голосов
/ 18 июня 2015

Я нашел простое решение.Вы должны добавить «? Application / xhtml + xml» позади вашего локального URL «file: /// ..».

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