7

के साथ "बॉडी स्ट्रीम थक गया अनुरोध" मैं छवियों को अपलोड करने के लिए XMLHttpRequest POSTs का उपयोग करने के लिए आईओएस 6 प्राप्त करने का प्रयास करने पर काम कर रहा हूं। यह डेस्कटॉप और एंड्रॉइड वेब ब्राउज़र पर काम करता है, लेकिन आईओएस 6 के साथ मुझे पृष्ठ पर एक त्रुटि मिल रही है: "बॉडी स्ट्रीम थक गया अनुरोध करें"। (सफारी वेब इंस्पेक्टर के साथ आईओएस सिम्युलेटर का उपयोग करना)।आईओएस 6 (आईफोन/आईपैड) छवि अपलोड करें एनटीएलएम/विंडोज प्रमाणीकरण

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); 
    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."); 
} 

जब किसी भी अन्य ब्राउज़र पर यह कर, हैंडलर सही ढंग से वापस आती है और फ़ाइल अपलोड करता है:

यहाँ पेज के बुनियादी कोड है। हालांकि, आईओएस के साथ एशक्स पेज में त्रुटि "अनुरोध निकाय धारा समाप्त हो गई है"।

Request Body Stream Exhausted

कोई भी विचार:

यहाँ निरीक्षक का एक स्क्रीनशॉट है?

अद्यतन: यह समस्या तब होती है जब आईआईएस में अनुप्रयोग के लिए एनटीएलएम/विंडोज प्रमाणीकरण सक्षम होता है। फॉर्म या अनाम प्रमाणीकरण के साथ, अपलोड ठीक काम करता है।

धन्यवाद,

जॉन

उत्तर

5

iOS 6 में, सफारी फ़ाइल सहित आरंभिक पोस्ट, के साथ फ़ाइल भेजता है। इसका मतलब है कि फ़ाइल स्ट्रीम अंत में है, या "थका हुआ है।"

हालांकि, एनटीएलएम के साथ, इसे प्रतिक्रिया में 401 चुनौती मिलेगी, और फिर प्रमाणीकरण जानकारी के साथ पोस्ट को फिर से भेजना होगा। चूंकि यह फ़ाइल स्ट्रीम को रीसेट नहीं करता है, इसलिए यह दूसरी पोस्ट के साथ फ़ाइल को फिर से भेजने में असमर्थ है। आप इसे आईआईएस लॉग में देख सकते हैं।

जहां तक ​​मुझे पता है, इसके आसपास कोई विशेष रूप से अच्छा तरीका नहीं है। मैं अपना मोबाइल ऐप बदल रहा हूं, ताकि यह फॉर्म प्रमाणीकरण का उपयोग कर सके। मैं मोबाइल ऐप को उसी सर्वर पर एक अलग लॉगिन ऐप पर निर्देशित करता हूं, जो विंडोज प्रमाणीकरण का उपयोग करने के लिए सेट है। लॉगिन ऐप फिर फॉर्म एप प्रमाणीकरण कुकी के साथ मुख्य ऐप पर रीडायरेक्ट कर सकता है, और सब ठीक है।

आपको वेब.कॉन्फिग फ़ाइल में दोनों ऐप्स पर मशीन कुंजी सेट करना है, ताकि दोनों एन्क्रिप्शन और सत्यापन के लिए एक ही कुंजी का उपयोग कर रहे हों। (सबसे पहले, हमारी सेवा का उपयोग

लॉगिन एप्लिकेशन पर कोड के रूप में सरल रूप में

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _ 
Handles Me.Load 
    With HttpContext.Current.User.Identity 
     If .IsAuthenticated Then 
      Dim sUser As String = .Name.ToLower.Trim 
      FormsAuthentication.RedirectFromLoginPage(s, False) 
     End If 
    End With 
End Sub 
+2

वास्तव में मैंने यह भी देखा है।आपका समाधान एक दिलचस्प है। उस समय के लिए (मैंने एप्पल को यह देखने के लिए एक बग सबमिट कर दिया है कि वे इसे ठीक कर सकते हैं), मेरे पास वास्तव में एक गैर-प्रमाणीकृत आईफ्रेम में फ़ाइल अपलोड होती है जो एएसपी.NET अस्थायी फ़ोल्डर में फ़ाइल अपलोड करती है और एक टोकन वापस भेजती है कि प्रमाणीकृत पृष्ठ तब temp फ़ोल्डर से फ़ाइल को पुनर्प्राप्त करते समय संदर्भ के लिए उपयोग करता है। –

+0

क्या कोई कामकाज है? शायद डब्ल्यूसीएफ का उपयोग कर, या शायद किसी अन्य तकनीक का उपयोग कर? मैं शेयरपॉइंट पर हूं, और विंडोज़ ऑथ एक आवश्यकता है। – harsimranb

0

मैं iOS 7 और आईओएस 8 पर आत्म परिभाषित HTTP प्रमाणित सिर की स्थापना नहीं द्वारा समस्या हल हो जाती है प्रमाणीकरण हेड के लिए स्वयं परिभाषित मान)। और प्रतिनिधि द्वारा संभाली जाने वाली चुनौती के बाद, अनुरोध में स्वचालित रूप से "प्रमाणीकरण: NTLMxxx स्वचालित रूप से" शीर्षलेख होगा। और पुट और पोस्ट फिर से काम करता है।

0

यह त्रुटि आईओएस पर आता है लेकिन formdata में अपने कोड लाइन को बदलने की तरह है जहाँ आप नीचे लाइन के लिए फ़ाइल

var fd = new FormData(); 

fd.append("fileToUpload", document.getElementById('fileToUpload').files[0]); 

जोड़कर मूल रूप से फ़ाइल नियंत्रण संलग्न नहीं है, लेकिन का उपयोग आप अलग दृष्टिकोण उपयोग कर सकते हैं बेस 64 छवि डेटा

var reader = new FileReader(); 

reader.readAsDataURL(opmlFile.files[0]); 

reader.onload = function() { 

    var base64DataImg = reader.result;    

    base64DataImg = base64DataImg.replace('data:'imagetype';base64,', '');  

}