我正在开发一个文件上传控件,该控件通过ajax发布表单数据。
我在Chrome,Firefox,IE 11、10中具有此工作的跨浏览器。但是,在Microsoft Edge浏览器中,似乎未触发上载“进度”事件。
谁能指出原因并告诉我Edge是否可以解决?
请参见下面的JavaScript代码段和以下HTML。
JavaScript:
...
uploadFile: function () {
var self = this;
var fileName = $('#file-input').val();
if (fileName) {
$('#file-upload-submit').attr('disabled', 'disabled');
// Browsers create a path with 'C:\fakepath in, which is not useful
// and needs to be stripped out
fileName = fileName.replace('C:\\fakepath\\', '');
var s3Key = self.s3KeyPrefix + self.createUuid() + '/' + fileName;
$('#s3-key').val(s3Key);
var fileExtension = self.getFileExtension(fileName);
var contentType;
if (fileExtension) {
// Find the content type by extension
for (var i = 0; i < self.contentTypeMap.length; i++) {
if (fileExtension === self.contentTypeMap[i][0]) {
contentType = self.contentTypeMap[i][1];
}
}
}
contentType = contentType || 'text/plain';
$('#content-type').val(contentType);
var form = $('#file-upload');
var xhr = new XMLHttpRequest();
var handleUploadCommon = function () {
$('#file-upload-submit').removeAttr('disabled', 'disabled');
self.clearForm();
self.clearProgress();
self.clearCancelBtn();
}
var handleUploadProgress = function (e)
{
if (e.lengthComputable) {
self.displayProgress(e.loaded, e.total);
}
}
var handleUploadComplete = function ()
{
var url = self.s3BrowserLinkPrefix + '/' + s3Key;
// Trigger callback
if (self.callbacks.onFileUploaded) {
self.callbacks.onFileUploaded(s3Key, url);
}
self.uploadedFiles.push({
url: url,
rendered: false
});
self.displayUploadedFiles();
handleUploadCommon();
}
var handleUploadError = function ()
{
handleUploadCommon();
console.error('An error occurred during file upload');
}
var handleUploadAbort = function ()
{
handleUploadCommon();
}
xhr.upload.addEventListener('progress', handleUploadProgress, false);
xhr.upload.addEventListener('load', handleUploadComplete, false);
xhr.addEventListener('error', handleUploadError, false);
xhr.addEventListener('abort', handleUploadAbort, false);
xhr.open('POST', form.attr('action'), true);
xhr.setRequestHeader('Access-Control-Allow-Origin', '*');
xhr.send(new FormData(form[0]));
if ($('#cancel-btn').length > 0) {
$('#cancel-btn').css('display', 'inline');
$('#cancel-btn').click(function () {
// Cancel ajax upload and reset form
xhr.abort();
handleUploadAbort();
});
}
}
},
displayProgress: function(loaded, total)
{
// If elements exist, display text percentage and / or progress bar
var pct = ((loaded / total) * 100) | 0; // | 0 coverts to int
if ($('#progress-percent').length > 0)
{
$('#progress-percent').css('display', 'inline-block');
$('#progress-percent-text').text(pct + '%');
}
if ($('#progress-bar').length > 0) {
$('#progress-bar-inner').css('width', pct + '%');
}
}
...
HTML:
<form id="file-upload" action="https://@(ViewBag.S3Bucket).s3.amazonaws.com/" method="post" enctype="multipart/form-data">
<input type="hidden" id="s3-key" name="key" /><br />
<input type="hidden" id="content-type" name="Content-Type" /><br />
<input type="hidden" name="acl" value="@ViewBag.S3Acl" />
<input type="hidden" name="AWSAccessKeyId" value="@ViewBag.AwsAccessKeyId" />
<input type="hidden" name="Policy" value="@ViewBag.Policy" />
<input type="hidden" name="Signature" value="@ViewBag.Signature" />
<input id="file-input" type="file" name="file" /> <br />
<div class="file-upload-submit-container">
<input id="file-upload-submit" class="btn btn-primary" type="button" name="submit" value="Upload"/>
<span id="progress-percent">
<svg class="loader" width='20px' height='20px' xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid" class="uil-ring-alt"><rect x="0" y="0" width="100" height="100" fill="none" class="bk"></rect><circle cx="50" cy="50" r="40" stroke="#bababa" fill="none" stroke-width="10" stroke-linecap="round"></circle><circle cx="50" cy="50" r="40" stroke="#707070" fill="none" stroke-width="6" stroke-linecap="round"><animate attributeName="stroke-dashoffset" dur="2s" repeatCount="indefinite" from="0" to="502"></animate><animate attributeName="stroke-dasharray" dur="2s" repeatCount="indefinite" values="150.6 100.4;1 250;150.6 100.4"></animate></circle></svg>
<span id="progress-percent-text">0%</span>
</span>
<span id="cancel">
<a id="cancel-btn">Cancel</a>
</span>
</div>
</form>
这是Edge 15的已知问题,您可以在此处进行检查。任何人都可以用这个小提琴来重现错误。
xhr.upload.onprogress = updateProgress;
// I only added this code because stack overflow forced me!
如您所见,它仅在达到100%时更新。
更新 Windows October似乎可以在Edge(Windows 1809版)上修复此错误。
问题内容: 看来我还没有清楚地传达出我的问题。我需要发送一个文件(使用AJAX),并且需要使用Nginx HttpUploadProgressModule 获取文件的上传进度。我需要一个很好的解决方案。我已经尝试过使用jquery.uploadprogress插件,但是我发现自己不得不重写其中的大部分内容,以使其在所有浏览器中都能正常工作并使用AJAX发送文件。 我所需要的只是执行此操作的代码,它
问题内容: 是否可以使用ajax将文件从浏览器升级到FTP服务器? 问题答案: 不会。浏览器不提供允许从JavaScript写入FTP的API。 您可以将文件发布到HTTP端点,然后使用服务器端代码将其推送到FTP服务器。
本文向大家介绍跨浏览器拖放HTML文件上传?,包括了跨浏览器拖放HTML文件上传?的使用技巧和注意事项,需要的朋友参考一下 对于跨浏览器的HTML File Uploader,请使用FileDrop。它几乎可以在所有现代Web浏览器上使用。 根据官方规范- FileDrop是一个独立的跨浏览器,用于HTML5,旧版,AJAX,拖放,JavaScript文件上传
有没有办法通过网络浏览器上传大文件(超过80 Gb)?以前我一直在使用plupload上传文件(img、png、jpg),但它似乎不适用于较大的文件。我也想知道如何实现一个网页,用户可以上传像Mega.co.nz或Drive.google.com。如果使用web开发工具无法做到这一点,有谁能指导我如何划分 谢谢。
我们目前有一个小的web应用程序,其中一部分是文件上传。目前,我们在客户端上使用Plupload,并启用了分块功能,以允许上传大型文件。这些文件被保存在应用服务器上,当它们出现时,这些块被追加。 现在,我们正在使用AmazonS3来存储文件,并有可能使用多个应用服务器。我发现很难处理这些大块。我试着以他们为榜样,但我遇到了问题。我尝试的主要内容是这样的: 我的问题是我需要知道上传的块。当我从上传的
问题内容: 我可以使用以下jQuery代码使用ajax请求的POST方法执行文件上传吗? 如果可能,我是否需要填写部分?这是正确的方法吗?我只将文件发布到服务器端。 我一直在搜索,但是我发现是一个插件,而在我的计划中我不想使用它。至少目前是这样。 问题答案: 上传文件是 不是 有可能通过AJAX。 您可以使用来上传文件,而无需刷新页面。 更新 使用XHR2,支持通过AJAX上传文件。例如通过对象,