Как получить данные формы, отправленные с помощью загрузки файла jQuery на сервлет Java?

В документах загрузки файлов jQuery говорится, что я могу отправлять дополнительные параметры данных формы, установив параметр formData для объекта перед его отправкой. Я делаю это так:

data.formData = {'a':'one', 'b':'two'};

...а затем звоню data.submit(). Мой сервлет Java (3.x) вызывается, но когда я пытаюсь получить параметры обычным способом, например.

request.getParameter("a");

...там ничего нет (т.е. это null). Я тоже посмотрел в request.getParameterNames() и request.getParameterMap(), они оба пустые.

Как я могу получить доступ к параметрам?

Это мои параметры инициализации загрузки файлов:

url: '/my-upload-servlet',
autoUpload: false,
singleFileUploads: false,
maxFileSize: 9000000,
acceptFileTypes: /(\.|\/)(gif|jpe?g|png|tif|tiff|pdf)$/i,
dataType: 'json',
previewMaxWidth: 128,
previewMaxHeight: 85,
disableImageResize: false,
previewCrop: true,

Я также попытался установить параметр formData для массива объектов, который, как говорят документы, также является вариантом, например.

data.formData = [ {name:'a', value:'one'}, {name:'b', value:'two'} ]

... но это все еще не работает.

Вот полный фрагмент кода для загрузки файла (закомментированные вещи — это другие вещи, которые я пробовал):

var params = new FormData();
params.append('params', JSON.stringify({a:'one', b:'two'}) );
data.formData = params;

//data.formData = {a:'one', b:'two'};

//data.formData = [
//    { name: 'a', value: 'one' },
//    { name: 'b', value: 'two' },
//];

//data.url = '/my-upload-servlet?a=one&b=two';

data.submit()
    .success(function (result, textStatus, jqXHR) {
        console.log('Hurray!');

    }).error(function (jqXHR, textStatus, errorThrown) {
        console.log('Boo!');

    }).complete(function (result, textStatus, jqXHR) { 
        console.log('Done');
    });

Ни один из них не работает для меня.
Независимо от того, какой из вышеперечисленных методов я пробую, вызов HttpServletRequest.getParameter("a") или HttpServletRequest.getParameter("params") (в случае FormData) всегда возвращает null.


person RTF    schedule 04.03.2016    source источник


Ответы (3)


Мы не можем отправить object в полезной нагрузке запроса на загрузку файла (multipar). Мы можем отправлять только пары ключ-значение. Однако, если мы хотим отправить json, нам сначала нужно преобразовать его в строку, используя:

var data = JSON.stringify(formData);

Как только это будет сделано, мы можем отправить его в полезной нагрузке запроса и десериализовать в сервлете, например:

mapper.readValue(request.getParameter(""), YourClass.class);
person Darshan Mehta    schedule 04.03.2016
comment
Достаточно справедливо, но в документах говорится, что вы можете указать объект и получить параметры обычным способом (выполните поиск «formData»): github.com/blueimp/jQuery-File-Upload/wiki/Options - person RTF; 04.03.2016
comment
Ты прав. Это так, однако я столкнулся с подобной проблемой несколько дней назад и сумел решить ее таким образом. - person Darshan Mehta; 04.03.2016
comment
После того, как я stringified заполнил данные формы, как мне установить их перед отправкой? Это data.formData = JSON.stringify(formData)? И как называется параметр? (для вызова getParameter() на стороне сервера) - person RTF; 04.03.2016
comment
Почему вы добавляете объект файла к объекту FormData. Об этом еще не позаботились? - person RTF; 04.03.2016
comment
Не могли бы вы добавить полную полезную нагрузку запроса в вопрос? - person Darshan Mehta; 04.03.2016
comment
stackoverflow.com/questions/15647503 / Вы можете взглянуть на это? - person Darshan Mehta; 04.03.2016

Я понял только после изучения консоли разработчика Chrome, что запрос все время включал параметры в полезную нагрузку запроса (даже при установке formData для объекта).

Проблема заключалась в доступе к ним на сервлете. Этот вопрос поставил меня на правильный путь: Получение полезной нагрузки запроса из POST запрос в сервлете Java

На самом деле я использую Apache Commons FileUpload в конце сервлета, поэтому я смог получить доступ к параметрам примерно так:

FileItemIterator iterator = upload.getItemIterator(request);
while ( iterator.hasNext() ){
    FileItemStream item = iterator.next();
    String paramName = item.getFieldName();
    InputStream paramValueStream = item.openStream();
    // do it...
} 
person RTF    schedule 04.03.2016

Этот ответ очень помог мне, отправив файл с помощью плагина jQuery FileUpload в сервлет Java: https://github.com/blueimp/jQuery-File-Upload

https://stackoverflow.com/a/32555960/2668852

person Derek Wade    schedule 28.10.2019