मैं वर्तमान में एएसपी.नेट वेब एपीआई का उपयोग करके एएसपी.नेट एमवीसी वेबसाइट के कुछ हिस्सों को अपग्रेड कर रहा हूं। उन सुविधाओं में से एक जो हम एक और अधिक विश्वसनीय डिजाइन में जा रहे हैं फ़ाइल अपलोड है। क्लाइंट के लिए, हम एक jquery प्लगइन का उपयोग कर रहे हैं, ajaxForm, एक आईफ्रेम के निर्माण को लपेटने के लिए जो फ़ाइल इनपुट तत्व वाले फॉर्म को सबमिट करेगा। यह एएसपी.नेट एमवीसी के साथ बहुत अच्छा काम कर रहा था।आईई आईफ्रेम एप्लिकेशन/जेसन प्रतिक्रिया को ठीक से संभाल नहीं करता
हमारे वेब एपीआई एंडपॉइंट का उपयोग करने के लिए इसे बदलते समय, जो "एप्लिकेशन/जेसन" के एक सामग्री-प्रकार के साथ प्रतिक्रिया देता है, हमने इंटरनेट एक्सप्लोरर 9 के साथ समस्याएं देखीं। ऐसा लगता है कि AJAXForm सफलता समारोह कभी नहीं कहा गया था। जो मैं बता सकता हूं, उससे ऐसा लगता है कि आईई में आईफ्रेम डाउनलोड करने के लिए फ़ाइल अटैचमेंट के रूप में "एप्लिकेशन/जेसन" के एक सामग्री-प्रकार के साथ प्रतिक्रिया के शरीर को व्याख्या करता है। इसका मतलब है कि यह आईफ्रेम की "लोडेड" घटना को कभी भी नहीं चलाता है, जिसका अर्थ है कि AJAXForm ऑनलोड इवेंट हैंडलर कभी ट्रिगर नहीं किया जाएगा, और हमारे AJAXForm सफलता फ़ंक्शन को कभी भी नहीं बुलाया जाएगा।
हमने आईई 7 में भी इस मुद्दे को देखा, लेकिन हम फ़ायरफ़ॉक्स या क्रोम के नवीनतम रिलीज़ संस्करणों में इस मुद्दे को फिर से नहीं बना पाएंगे, भले ही उन्हें फॉर्मडाटा के साथ फ़ाइल एपीआई के बजाय आईफ्रेम का उपयोग करने के लिए मजबूर किया जा सके।
अब इस समस्या को हल करने के लिए, अब मैं प्रतिक्रिया-प्रकार को "टेक्स्ट/सादा" पर वापस मजबूर कर रहा हूं, जो कि हम एएसपी.नेट एमवीसी नियंत्रक कार्यों से पहले वापस लौट रहे थे, जो फ़ाइल अपलोड को संभाला था। यह सब कुछ फिर से काम करता है।
मेरे सवालों का:
- वहाँ एक रास्ता मैं के रूप में "application/json" वेब एपीआई प्रतिक्रिया सामग्री प्रकार रख सकते और IE इसे सही ढंग से व्याख्या की है है?
- क्या आईई और वेब एपीआई का उपयोग करते समय फ़ाइल अपलोड करने का कोई बेहतर तरीका है? शायद एक अलग प्लगइन या बेहतर तकनीक?
अतिरिक्त प्रतिबंध: मैं इस वेबसाइट के लिए ActiveX या Flash का उपयोग नहीं कर सकता। मैं एक अलग प्लगइन का उपयोग कर सकता हूं, लेकिन केवल अगर इसमें सामान्य क्रॉस-ब्राउज़र समर्थन है। (आईई, क्रोम, फायरफॉक्स, सफारी, आदि)
मेरे HTML:
<form id="uploadFormId" action="" method="post" enctype="multipart/form-data" encoding="multipart/form-data">
<input type="file" name="files[]"/>
</form>
मेरे जावास्क्रिप्ट:
function onFileChange(e) {
if (e.type === e.originalEvent.type) {
var filePath = $(e.currentTarget).val();
if (filePath !== '') {
$(this).closest('form').submit();
}
}
};
$(function() {
$('#uploadFormId').ajaxForm({
url: "api/Files/1234",
dataType: 'json',
success: function (response) {
alert(response);
},
error: function (xhr, status, error) {
alert(status);
}
});
$('#uploadFormId input[type="file"]').bind('change', onFileChange);
});
"application/json" प्रतिक्रिया हेडर (आईई में काम नहीं करता) :
Cache-Control:no-cache
Content-Length:337
Content-Type:application/json; charset=utf-8
Date:Wed, 17 Jul 2013 13:10:47 GMT
Expires:-1
Pragma:no-cache
Server:Microsoft-IIS/8.0
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET
"पाठ/सादे" प्रतिक्रिया हेडर (आईई में काम करता है):
Cache-Control:no-cache
Content-Length:322
Content-Type:text/plain
Date:Wed, 17 Jul 2013 13:17:24 GMT
Expires:-1
Pragma:no-cache
Server:Microsoft-IIS/8.0
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET
"आईई 9 + इस तरह से व्यवहार क्यों करता है" के सवाल के लिए: उचित फ़ाइल प्रकार के रूप में एप्लिकेशन/जेसन का इलाज करना (किसी अन्य प्रारूप में स्नीफ करने के बजाय फ़ाइल डाउनलोड करना) आईई 9 के लिए एक सुरक्षा फिक्स था। – EricLaw