如何使用JSP / Servlet和Ajax将文件上传到服务器?
我正在创建一个JSP / Servlet Web应用程序,我想通过Ajax将文件上传到Servlet。 我会如何去做这件事? 我正在使用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");
}
});
});
但是,它似乎没有发送文件内容。
为了这一点,因为当前XMLHttpRequest
13759 jQuery的版本1,它是不可能通过上传使用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>
至于servlet方面,这里没有特殊的东西需要完成。 只需按照与不使用Ajax时相同的方式实现它:如何使用JSP / Servlet将文件上载到服务器?
如果X-Requested-With
标头等于XMLHttpRequest
,那么只需要在servlet中进行额外的检查,以便知道在客户端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能够使用新的File
和FormData
API发送选定的文件。 另请参阅HTML5文件上传到Java Servlet,并通过xmlHttpRequest将文件作为多部分发送。
这段代码适合我:
$('#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>
如果表单只有文件类型的输入,如果除文件类型之外还有其他一些输入,那么@ Monsif的代码运行良好,然后它们会丢失。 因此,不是复制每个表单数据并将它们附加到FormData对象,而是将原始表单本身赋予构造函数。
关于@ Monsif的代码和https://www.new-bamboo.co.uk/blog/2012/01/10/ridiculously-simple-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>
链接地址: http://www.djcxy.com/p/46059.html
上一篇: How to upload files to server using JSP/Servlet and Ajax?