Как загрузить файлы на сервер, используя JSP / Servlet и Ajax? - PullRequest
18 голосов
/ 02 августа 2011

Я создаю веб-приложение JSP / Servlet и хочу загрузить файл в Servlet через Ajax Как бы я поступил так? Я использую jQuery.

Я уже сделал:

<form class="upload-box">
    <input type="file" id="file" name="file1" />
    <span id="upload-error" class="error" />
    <input type="submit" id="upload-button" value="upload" />
</form>

С этим jQuery:

$(document).on("#upload-button", "click", function() {
    $.ajax({
        type: "POST",
        url: "/Upload",
        async: true,
        data: $(".upload-box").serialize(),
        contentType: "multipart/form-data",
        processData: false,
        success: function(msg) {
            alert("File has been uploaded successfully");
        },
        error:function(msg) {
            $("#upload-error").html("Couldn't upload file");
        }
    });
});

Однако, похоже, что содержимое файла не отправляется.

Ответы [ 4 ]

21 голосов
/ 02 августа 2011

Кстати, с текущей XMLHttpRequest версии 1, используемой jQuery, не можно загружать файлы с помощью JavaScript через XMLHttpRequest. Обычный обходной путь - позволить JavaScript создать скрытый <iframe> и вместо этого отправить ему форму, чтобы создать впечатление, что это происходит асинхронно. Это именно то, что делает большинство плагинов для загрузки файлов jQuery, таких как плагин jQuery Form ( пример здесь ).

Предполагается, что ваш JSP с HTML-формой переписан таким образом, чтобы он не был сломан , когда у клиента отключен JS (как у вас сейчас ...), как показано ниже:

<form id="upload-form" class="upload-box" action="/Upload" method="post" enctype="multipart/form-data">
    <input type="file" id="file" name="file1" />
    <span id="upload-error" class="error">${uploadError}</span>
    <input type="submit" id="upload-button" value="upload" />
</form>

Тогда это с помощью плагина jQuery Form всего за

<script src="jquery.js"></script>
<script src="jquery.form.js"></script>
<script>
    $(function() {
        $('#upload-form').ajaxForm({
            success: function(msg) {
                alert("File has been uploaded successfully");
            },
            error: function(msg) {
                $("#upload-error").text("Couldn't upload file");
            }
        });
    });
</script>

Что касается сервлетной стороны, здесь не нужно делать никаких специальных действий. Просто реализуйте это точно так же, как если бы вы не использовали Ajax: Как загрузить файлы на сервер с помощью JSP / Servlet?

Вам потребуется дополнительная проверка в сервлете только в том случае, если заголовок X-Requested-With равен XMLHttpRequest или нет, чтобы вы знали, какой ответ нужно вернуть в случае, если у клиента отключен JS (как в настоящее время это в основном старые мобильные браузеры с отключенным JS).

if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) {
    // Return ajax response (e.g. write JSON or XML).
} else {
    // Return regular response (e.g. forward to JSP).
}

Обратите внимание, что относительно новая XMLHttpRequest версия 2 способна отправлять выбранный файл с использованием новых API File и FormData. См. Также Загрузка файла HTML5 в сервлет Java и отправка файла в виде составной части через xmlHttpRequest .

3 голосов
/ 11 октября 2016

@ Код Monsif работает хорошо, если в форме есть только входные данные типа файла, если есть другие входные данные, отличные от типа файла, они теряются.Таким образом, вместо копирования всех данных формы и добавления их в объект FormData, исходная форма может быть передана конструктору.

Относительно кода @ Monsif и https://www.new -bamboo.co.uk/ blog / 2012/01/10 / смехотворно-простой пост-ajax-uploads-with-formdata / , я вышел со следующим кодом, который работал для меня.Я надеюсь, что это поможет кому-то еще.

<script type="text/javascript">
        var files = null; // when files input changes this will be initiliazed.
        $(function() {
            $('#form2Submit').on('submit', uploadFile);
    });

        function uploadFile(event) {
            event.stopPropagation();
            event.preventDefault();
            //var files = files;
            var form = document.getElementById('form2Submit');
            var data = new FormData(form);
            postFilesData(data);
}

        function postFilesData(data) {
            $.ajax({
                url :  'yourUrl',
                type : 'POST',
                data : data,
                cache : false,
                dataType : 'json',
                processData : false,
                contentType : false,
                success : function(data, textStatus, jqXHR) {
                    alert(data);
                },
                error : function(jqXHR, textStatus, errorThrown) {
                    alert('ERRORS: ' + textStatus);
                }
            });
        }
</script>

HTML-код может быть что-то вроде следующего:

<form id ="form2Submit" action="yourUrl">
  First name:<br>
  <input type="text" name="firstname" value="Mickey">
  <br>
  Last name:<br>
  <input type="text" name="lastname" value="Mouse">
  <br>
<input id="fileSelect" name="fileSelect[]" type="file" multiple accept=".xml,txt">
<br>
  <input type="submit" value="Submit">
</form>
2 голосов
/ 24 ноября 2015

Этот код отлично работает для меня:

$('#fileUploader').on('change', uploadFile);


function uploadFile(event)
	{
	    event.stopPropagation(); 
	    event.preventDefault(); 
	    var files = event.target.files; 
	    var data = new FormData();
	    $.each(files, function(key, value)
	    {
	        data.append(key, value);
	    });
	    postFilesData(data); 
	 }
	
function postFilesData(data)
	{
	 $.ajax({
        url: 'yourUrl',
        type: 'POST',
        data: data,
        cache: false,
        dataType: 'json',
        processData: false, 
        contentType: false, 
        success: function(data, textStatus, jqXHR)
        {
        	//success
        },
        error: function(jqXHR, textStatus, errorThrown)
        {
            console.log('ERRORS: ' + textStatus);
        }
	    });
	}
<form method="POST" enctype="multipart/form-data">
	<input type="file" name="file" id="fileUploader"/>
</form>
0 голосов
/ 23 декабря 2016

Этот код работает для меня.

Используются общие файлы io.jar и файл upload.jar общих файлов и плагин формы jQuery

<script>
    $(function() {
        $('#upload-form').ajaxForm({
            success: function(msg) {
                alert("File has been uploaded successfully");
            },
            error: function(msg) {
                $("#upload-error").text("Couldn't upload file");
            }
        });
    });
</script>
<form id="upload-form" class="upload-box" action="upload" method="POST" enctype="multipart/form-data">
    <input type="file" id="file" name="file1" />
    <span id="upload-error" class="error">${uploadError}</span>
    <input type="submit" id="upload-button" value="upload" />
</form>
 boolean isMultipart = ServletFileUpload.isMultipartContent(request);

        if (isMultipart) {
            // Create a factory for disk-based file items
            FileItemFactory factory = new DiskFileItemFactory();

            // Create a new file upload handler
            ServletFileUpload upload = new ServletFileUpload(factory);

            try {
                // Parse the request
                List items = upload.parseRequest(request);
                Iterator iterator = items.iterator();
                while (iterator.hasNext()) {
                    FileItem item = (FileItem) iterator.next();
                    if (!item.isFormField()) {
                        String fileName = item.getName();    
                        String root = getServletContext().getRealPath("/");
                        File path = new File(root + "../../web/Images/uploads");
                        if (!path.exists()) {
                            boolean status = path.mkdirs();
                        }

                        File uploadedFile = new File(path + "/" + fileName);
                        System.out.println(uploadedFile.getAbsolutePath());
                        item.write(uploadedFile);
                    }
                }
            } catch (FileUploadException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }



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