gpt4 book ai didi

javascript - 创建在 IE 中工作的文件上传

转载 作者:技术小花猫 更新时间:2023-10-29 12:16:25 26 4
gpt4 key购买 nike

我想编写一个可以在 IE 中运行的文件上传脚本,但是我正在编写的两种类型的代码在 IE 中都有问题。

请帮忙。怎么写一个可以在IE下运行的文件上传脚本?

类型 1
问题不支持 IE 中的文件 Api(不使用它的技巧是什么?)

    <!DOCTYPE html>

<html>
<head runat="server">
<title></title>
<script src="Scripts/jquery-1.6.2.js" type="text/javascript"></script>
<script type="text/javascript">
function updateSize() {
var nBytes = 0;
var nFiles=0;
oFiles = document.getElementById("uploadInput").files;
nFiles = oFiles.length;
for (var nFileId = 0; nFileId < nFiles; nFileId++) {
nBytes += oFiles[nFileId].size;
}
var sOutput = nBytes + " bytes";
// optional code for multiples approximation
for (var aMultiples = ["KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"], nMultiple = 0, nApprox = nBytes / 1024; nApprox > 1; nApprox /= 1024, nMultiple++) {
sOutput = nApprox.toFixed(3) + " " + aMultiples[nMultiple] + " (" + nBytes + " bytes)";
}
document.getElementById("fileNum").innerHTML = nFiles;
document.getElementById("fileSize").innerHTML = sOutput;
}
// end of optional code
</script>
</head>
<body>
<form id="form1" runat="server">
<p><input id="uploadInput" type="file" name="myFiles" onchange="updateSize();" multiple /> selected files: <span id="fileNum">0</span>; total size: <span id="fileSize">0</span></p>
<p><input type="submit" value="Send file"></p>
</form>
</body>
</html>

类型 2
问题不支持 document.getElementById('fileToUpload') .files[0] (不获取文件 [0] 的诀窍是什么?)
 <script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script>
<script type="text/javascript">
function fileSelected() {
var file = document.getElementById('fileToUpload').files[0];
if (file) {
var fileSize = 0;
if (file.size > 1024 * 1024)
fileSize = (Math.round(file.size * 100 / (1024 * 1024)) / 100).toString() + 'MB';
else
fileSize = (Math.round(file.size * 100 / 1024) / 100).toString() + 'KB';

document.getElementById('fileName').innerHTML = 'Name: ' + file.name;
document.getElementById('fileSize').innerHTML = 'Size: ' + fileSize;
document.getElementById('fileType').innerHTML = 'Type: ' + file.type;
}
}

function uploadFile() {
var fd = new FormData();
fd.append("fileToUpload", document.getElementById('fileToUpload').files[0]);
var xhr = new XMLHttpRequest();
xhr.upload.addEventListener("progress", uploadProgress, false);
xhr.addEventListener("load", uploadComplete, false);
xhr.addEventListener("error", uploadFailed, false);
xhr.addEventListener("abort", uploadCanceled, false);
$.post("UploadHandler.ashx");
//xhr.open("POST", "UploadHandler.ashx");
xhr.send(fd);
}

function uploadProgress(evt) {
if (evt.lengthComputable) {
var percentComplete = Math.round(evt.loaded * 100 / evt.total);
document.getElementById('progressNumber').innerHTML = percentComplete.toString() + '%';
document.getElementById('prog').value = percentComplete;
}
else {
document.getElementById('progressNumber').innerHTML = 'unable to compute';
}
}

function uploadComplete(evt) {
/* This event is raised when the server send back a response */
alert(evt.target.responseText);
}

function uploadFailed(evt) {
alert("There was an error attempting to upload the file.");
}

function uploadCanceled(evt) {
alert("The upload has been canceled by the user or the browser dropped the connection.");
}
</script>

</head>
<body>
<form id="form1">
<div>
<label for="fileToUpload">
Select a File to Upload</label>
<input type="file" name="fileToUpload[]" id="fileToUpload" onchange="fileSelected();" />
</div>
<div id="fileName">
</div>
<div id="fileSize">
</div>
<div id="fileType">
</div>
<div>
<input type="button" onclick="uploadFile()" value="Upload" />
</div>
<div id="progressNumber">
</div>
<progress id="prog" value="0" max="100.0"></progress>
</form>
</body>

请帮忙 :(

最佳答案

除非您使用 IE10 或其他现代浏览器,否则无法使用这些功能。较早版本的 Internet Explorer(和其他浏览器)可能有变通方法,但您也需要调整后端代码。
为什么它不起作用
直到版本 10 的 Internet Explorer 不支持许多这些功能,关键是 FormDataFileReader蜜蜂。您的两个代码片段都依赖于 FileReader API,第二个也是依赖FormData动态上传文件。
如何判断是否执行代码
我最近编写了一个文件上传小部件来检测这些功能并根据支持提供不同的代码。我使用了来自 Modernizr 的特征检测,因为它的测试定期由开源社区进行测试:

var support  = {
// Are files exposed to JS?
// As used by Modernizr @
// https://github.com/Modernizr/Modernizr/blob/master/feature-detects/file/api.js
'fileReader' : (function testFileReader(){
// Test: look for global file class.
return !!(window.File && window.FileList && window.FileReader);
}()),

// AJAX file upload via formData?
'formData' : window.FormData !== void 0
};
为您 fileSelected功能,你需要 support.fileReader评估 true ;为 uploadFile ,您需要 support.formData .
不支持这些功能的浏览器的解决方法
如果没有这些功能,就不可能从前端读取文件或使用 AJAX 发送文件。但是,您可以做的是通过隐藏的 <iframe/> 发送您的文件。在您当前的页面中,并获得 UploadHandler.ashx以不同方式响应非 XHR 请求。
这个解决方案在技术上是同步的(只是发生在另一个隐藏的页面中),所以你不会得到更新——唯一的反馈是上传完成并且服务器已经响应。因此,您只能在用户完全上传文件后通知他们文件名、大小和成功 - 这可能需要一段时间!
无论如何,此 HTML 将如下所示:
<form 
id="form1"
runat="server"
action="UploadHandler.ashx"
target="fileIframe">
<iframe
name="fileIframe"
style="display:none"
onload="parseIframeResponse"
tabindex="-1">
</iframe>
<p>
<input id="uploadInput" type="file" name="myFiles" onchange="updateSize();" multiple />
selected files:
<span id="fileNum">
0
</span>
; total size:
<span id="fileSize">
0
</span>
</p>
<p>
<input type="submit" value="Send file">
</p>
</form>
一些变化:
  • 表单现在有 target ,这意味着当它把它的内容发布到 action 中的 URI 时,它将在那里加载响应,而不是在当前页面上。
  • 目标是 name对我们包含的 iframe 的引用。它是用 display:none 隐藏的,并给出一个负值 tabindex只是为了确保用户不会偶然发现它。它还有一个 onload指定的属性。这是在旧版 IE 中将函数绑定(bind)到 load 事件的唯一方法。

  • 所以当表单提交时,我们停留在当前页面上,服务器响应加载到我们隐藏的 iframe 中。发生这种情况时,浏览器将执行 onload 中命名的函数。属性。可悲的是,这意味着该函数需要在全局范围内!
    后端的东西
    我不知道你的后端是如何工作的,但如果 iframe 是加载响应而不是下载它,它需要是 HTML 或纯文本(并且需要在 mime-type 中指定)。您可以通过查找 X-Requested-With 来判断该表单是否是通过 AJAX 从后端发布的。 header ,其值应为 XMLHttpRequest — 如果不存在,则 iframe 正在请求响应,您需要发送文本或 HTML。您可能希望将 JSON 响应字符串化,以公开您想要反馈给用户的值,例如 fileName , fileSize & fileType .我希望你可以自己做这件事,或者找一个同事来处理。
    捕获 iframe 响应
    如前所述,响应处理函数需要在 onload 的全局范围内。要绑定(bind)到的属性,因为旧的 IE 非常古怪。我看到你在使用 jQuery,所以如果你沿着字符串化服务器响应的路线,你可以写这个函数如下:
    function parseIframeResponse(){
    var response = $('#fileIframe').contents().find('body').text();
    var object = $.parseJSON(response);
    }

    Issues with the iframe load event binding

    As mentioned earlier, the iframe load event needs to be bound inline as an attribute of the iframe itself — this is because IE will simply fail to register it otherwise. But this is problematic in and of itself because even an empty iframe (an empty or non-present src will default to about:blank) fires a load event. To mitigate this you will need to discard any response that evaluates to an empty string as a false positive, and make sure your back-end responds with some content even if it encounters a fault.


    大概,然后您会想要使用那里的任何信息来执行您当前在函数 fileSelected 中获得的一些代码。 , uploadProgress , 等等。
    希望这可以帮助。
    编辑 1:开箱即用的解决方案
    事后看来,尽管在开发了我自己的问题解决方案的背后写下了这一点,更不用说 Fine Uploader 也可以被认为是疏忽大意的。 ,一个经过大量测试 ( over 700 closed issues!) 且维护良好的独立插件,旨在为 IE7 及更高版本实现最佳的文件上传体验。还有 a good selection of back-end server components — 包括 ASP.NET — 来解析上传。您可能会发现调整它比自己动手更容易!
    编辑 2:忽略提及 iframe 的问题 load事件。修改答案到位。

    关于javascript - 创建在 IE 中工作的文件上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15664069/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com