我需要有条件地打开以下文件上传对话框:
<input type="file" id="Upload">
基于来自服务器的Ajax响应。输入元素是隐藏的,因为我不希望显示默认的丑陋文件文本框和按钮。所以我有另一个用户点击的元素来启动上传。
以下可以从用户启动事件上下文的脚本中正常工作。
$('#Upload').click();
但在Ajax调用的响应执行时失败。现在我知道这是设计用于Firefox和Chrome的安全问题,但在我的情况下,用户启动ajax调用,并且服务器需要决定服务器上的条件当前是否允许上传。如果是这样,我想打开文件上传对话框,否则我需要发布一条消息,说明x原因不允许该操作(由服务器返回)。
问题是Ajax回调不在用户脚本上下文中,因此不会执行.click()打开文件对话框(按设计)。
还可以采取哪些措施来解决这个问题?有没有办法捕获用户事件上下文并将其重用于Ajax调用的回调?
答案 0 :(得分:0)
使用JQuery创建一个简单的上传器使用此代码
HTML
<form id="form" enctype="multipart/form-data">
<input type="file" id="Upload"></br>
<div class="progress">
<div class="progress-bar progress-bar-info progress-bar-striped active" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%"></div>
</div>
<button type="submit">Start Upload</button>
</form>
您选择文件,并在单击“开始上传”按钮确认上传后
JQuery的
$('#form').submit(function(){
var data = new FormData(this);
$.ajax({
type: "POST",
url: URL_TO_UPLOADER,
data: data,
contentType: false,
cache: false,
processData:false,
beforeSend: function() {
$(".progress-bar").width('0%');
},
xhr: function() {
var xhr = new window.XMLHttpRequest();
// Upload progress
xhr.upload.addEventListener("progress", function(evt) {
if (evt.lengthComputable) {
var percentComplete = (evt.loaded / evt.total) * 100;
$(".progress-bar").width(percentComplete+'%');
}
}, false);
// Download progress
xhr.addEventListener("progress", function(evt) {
if (evt.lengthComputable) {
var percentComplete = evt.loaded / evt.total * 100;
$find(".progress-bar").width(percentComplete+'%');
}
}, false);
return xhr;
},
success: function(data) {
alert("Success");
// File Uploaded
},
error: function(xhr, textStatus, errorThrown) {
alert("Error");
},
});
});
PATH_TO_UPLOADER是接收该文件的网址。