Как получить путь к файлу от формы ввода HTML в Firefox 3

Когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа int:

int x;
x = 10;

В этом примере переменная x является int, и Java инициализирует ее для 0. Когда вы назначаете его 10 во второй строке, ваше значение 10 записывается в ячейку памяти, на которую указывает x.

Но когда вы пытаетесь объявить ссылочный тип, произойдет что-то другое. Возьмите следующий код:

Integer num;
num = new Integer(10);

Первая строка объявляет переменную с именем num, но она не содержит примитивного значения. Вместо этого он содержит указатель (потому что тип Integer является ссылочным типом). Поскольку вы еще не указали, что указать на Java, он устанавливает значение null, что означает «Я ничего не указываю».

Во второй строке ключевое слово new используется для создания экземпляра (или создания ) объекту типа Integer и переменной указателя num присваивается этот объект. Теперь вы можете ссылаться на объект, используя оператор разыменования . (точка).

Exception, о котором вы просили, возникает, когда вы объявляете переменную, но не создавали объект. Если вы попытаетесь разыменовать num. Перед созданием объекта вы получите NullPointerException. В самых тривиальных случаях компилятор поймает проблему и сообщит вам, что «num не может быть инициализирован», но иногда вы пишете код, который непосредственно не создает объект.

Например, вы можете имеют следующий метод:

public void doSomething(SomeObject obj) {
   //do something to obj
}

В этом случае вы не создаете объект obj, скорее предполагая, что он был создан до вызова метода doSomething. К сожалению, этот метод можно вызвать следующим образом:

doSomething(null);

В этом случае obj имеет значение null. Если метод предназначен для того, чтобы что-то сделать для переданного объекта, целесообразно бросить NullPointerException, потому что это ошибка программиста, и программисту понадобится эта информация для целей отладки.

Альтернативно, там могут быть случаи, когда цель метода заключается не только в том, чтобы работать с переданным в объекте, и поэтому нулевой параметр может быть приемлемым. В этом случае вам нужно будет проверить нулевой параметр и вести себя по-другому. Вы также должны объяснить это в документации. Например, doSomething может быть записано как:

/**
  * @param obj An optional foo for ____. May be null, in which case 
  *  the result will be ____.
  */
public void doSomething(SomeObject obj) {
    if(obj != null) {
       //do something
    } else {
       //do something else
    }
}

Наконец, Как определить исключение & amp; причина использования Трассировки стека

52
задан kamal 17 February 2013 в 23:37
поделиться

8 ответов

Просто Вы не можете сделать этого с FF3.

другая опция могла использовать апплет или другие средства управления, чтобы выбрать и загрузить файлы.

0
ответ дан 7 November 2019 в 09:29
поделиться

На самом деле, непосредственно перед тем, как FF3 отсутствовал, я сделал некоторые эксперименты, и FF2 отправляет только имя файла, как сделал Opera 9.0. Только IE отправляет полный путь. Поведение имеет смысл, потому что сервер не должен знать, где пользователь хранит файл на своем компьютере, это не важно процессу загрузки. Если Вы не пишете приложение интранет и получаете файл прямым доступом к сети!

то, Что изменилось (и это - основное назначение объекта ошибки, на который Вы указываете на), - то, что FF3 больше не позволяют доступу к пути к файлу от JavaScript. И не позволит, вводят/вставляют путь там, который является более раздражающим для меня: у Меня есть расширение оболочки, которое копирует путь файла от Windows Explorer до буфера обмена, и я использовал его много в такой форме. Я решил проблему при помощи расширения DragDropUpload. Но это становится вне темы, я боюсь.

интересно, что Ваши Веб-формы делают, чтобы прекратить работать с этим новым поведением.

[РЕДАКТИРОВАНИЕ] После того, чтобы читать страницу, связанную Mike, я вижу действительно, использование интранет пути (определите, что пользователь, например) и локальное использование (показывают предварительный просмотр изображения, локальное управление файлами). Пользовательский Затор-es, кажется, предоставляет обходному решению nsIDOMFile (не попробованный все же).

2
ответ дан PhiLho 7 November 2019 в 09:29
поделиться

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

http://www.ab-d.fr/date/2008-07-12/

Это находится на французском языке, но кодом является JavaScript:)

Это - ссылки, на которые указывает статья: http://developer.mozilla.org/en/nsIDOMFile http://developer.mozilla.org/en/nsIDOMFileList

0
ответ дан Victor 7 November 2019 в 09:29
поделиться

Взгляните на XPCOM, могло бы быть что-то, что можно использовать, если Firefox 3 используется клиентом.

0
ответ дан LohanJ 7 November 2019 в 09:29
поделиться

Это альтернативное решение / исправление ... В FF3 вы можете получить полный путь к файлу в текстовом поле вместо окна просмотра файла. И это тоже ... Путем перетаскивания файла!

Вы можете перетащить свой файл в текстовое поле на своей html-странице. и он отобразит полный путь к файлу. Эти данные можно легко передать на ваш сервер или манипулировать ими.

Все, что вам нужно сделать, это использовать расширение DragDropUpload

http://www.teslacore.it/wiki/index.php?title=DragDropUpload

Это расширение поможет вам перетащить файлы в окно просмотра файлов (входной файл). Но вы все равно не сможете получить полный путь к файлу, если попытаетесь его восстановить.

Итак, я немного изменил это расширение. Таким образом, я могу перетащить файл в любое поле «ввода текста» и получить полный путь к файлу.

0
ответ дан 7 November 2019 в 09:29
поделиться

Один из чрезвычайно уродливых способов решить эту проблему - попросить пользователя вручную ввести каталог в текстовое поле и добавить его обратно в начало значения файла в JavaScript.

Грязный ... но это зависит от уровня пользователя, с которым вы работаете, и позволяет обойти проблему безопасности.

<form>
    <input type="text" id="file_path" value="C:/" />
    <input type="file" id="file_name" />
    <input type="button" onclick="ajax_restore();" value="Restore Database" />
</form>

JavaScript

var str = document.getElementById('file_path').value;
var str = str + document.getElementById('file_name').value;
0
ответ дан 7 November 2019 в 09:29
поделиться

Для предварительного просмотра в Firefox работает это - вложение является объектом элемента вложения в первом примере:

           if (attachment.files)
             previewImage.src = attachment.files.item(0).getAsDataURL();
           else
             previewImage.src = attachment.value;
10
ответ дан 7 November 2019 в 09:29
поделиться

В IE7 (и, вероятно, во всех известных браузерах, включая старый Firefox 2), если мы отправим файл типа «// server1 / path / to / file / filename», он будет работать правильно и даст полный путь к файлу и имя файла.

Я понятия не имею, как преодолеть эту «новую функцию», потому что она приводит к тому, что все формы загрузки в моем веб-приложении перестают работать в Firefox 3.

Здесь есть серьезное недоразумение. Зачем вообще нужен полный путь к файлу на стороне сервера? Представьте, что я клиент и у меня есть файл по адресу C: \ path \ to \ passwords.txt , и я даю вам полный путь к файлу. Как бы вы, будучи сервером, получили его содержимое ? У вас есть открытое TCP-соединение с моей файловой системой на локальном диске? Проверяли ли вы функцию загрузки файлов, когда запустили веб-приложение в производство на другом сервере?

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

То, что полный путь к файлу отправляется в MSIE и других древних веб-браузерах, связано с ошибкой безопасности . В спецификациях W3 и RFC2388 никогда не упоминалось включение полного пути к файлу. Только имя файла. Firefox делает свою работу правильно.

Для обработки загруженных файлов вам не нужно знать полный путь к файлу.Вас скорее должно заинтересовать полное содержимое файла , которое клиент уже отправил на сервер в теле запроса в случае запроса multipart / form-data . Измените форму, чтобы она выглядела следующим образом, как указано в RFC2388:

<form action="upload-script-url" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit">
</form>

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

  • Java / JSP : вы хотите использовать HttpServletRequest # getPart () или Apache Commons FileUpload API для его анализа. У вас должен получиться InputStream с содержимым файла, который вы, в свою очередь, можете записать в любой OutputStream на свой вкус. Вы можете найти пример в этом ответе .

  • Java / JSF : вы хотите использовать компонент или любой другой компонент загрузки файлов, предоставляемый используемой библиотекой компонентов. Также здесь вы хотите получить содержимое файла в виде InputStream . См. этот ответ в качестве примера.

  • PHP : содержимое файла уже неявно сохранено на временном диске. Вы хотите использовать функцию move_uploaded_file () , чтобы переместить его в желаемое место. См. Также руководство по PHP .

  • ASP.NET : подробного ответа от меня нет, поскольку я этого не делаю, но Google нашел для меня несколько примеров: Пример ASP.NET , ASP.NET 2.0 пример

Всякий раз, когда вы хотите получить часть имени загруженного файла, вы должны обрезать полный путь из имени файла.Эта информация совершенно не актуальна для вас. Также см., Например, эту запись часто задаваемых вопросов Apache Commons FileUpload

Почему FileItem.getName () возвращает весь путь, а не только имя файла?

Internet Explorer предоставляет полный путь к загруженному файлу, а не просто базовое имя файла. Поскольку FileUpload предоставляет именно то, что было предоставлено клиентом (браузером), вы можете удалить эту информацию о пути в своем приложении.

61
ответ дан 7 November 2019 в 09:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: