6

जो मैं पूरा करने का प्रयास कर रहा हूं वह कुछ बाइनरी डेटा अपलोड करना है, विशेष रूप से एक PNGArray एक पीएनजी छवि का प्रतिनिधित्व करना, URLRequest के साथ URLLoader क्लास का उपयोग कर सर्वर पर।अप्रत्याशित फ्लैश सुरक्षा अपवाद URLLoader का उपयोग करते समय

जब मैं contentType URLRequest की डिफ़ॉल्ट रूप से 'multipart/form-data' की प्रॉपर्टी सेट करता हूं, तो urlLoader.load() पर कॉल सुरक्षा अपवाद में परिणाम देता है।

जब मैं contentType संपत्ति को डिफॉल्ट के रूप में छोड़ देता हूं, तो यह ठीक काम करता है, लेकिन सर्वर पर फ़ाइल अपलोड करने के लिए लंबे समय तक (पीएनजी फ़ाइल की लंबाई के समान) लेता है।

तो, मेरा सवाल यह है कि मुझे यह सुरक्षा अपवाद क्यों मिल रहा है? और मैं इससे कैसे बच सकता हूं?

ध्यान दें कि मेरे एसडब्ल्यूएफ को विकास सर्वर से सेवा दी जा रही है, न कि स्थानीय फाइल सिस्टम (Google ऐप इंजन विकास सर्वर सटीक होना)।

यहाँ कोड है:

var pngFile:ByteArray = PNGEncoder.encode(bitmapData); 

var urlRequest:URLRequest = new URLRequest('/API/uploadImage'); 

// With this line of code, the call to urlLoader.load() throws the following security exception: 
// 'SecurityError: Error #2176: Certain actions, such as those that display a pop-up window, may only be invoked upon user interaction, for example by a mouse click or button press.' 
urlRequest.contentType = 'multipart/form-data'; 

urlRequest.method = URLRequestMethod.POST; 
urlRequest.data = pngFile; 
urlRequest.requestHeaders.push(new URLRequestHeader('Cache-Control', 'no-cache')); 

urlLoader = new URLLoader(); 
urlLoader.dataFormat = URLLoaderDataFormat.TEXT; 
urlLoader.addEventListener(Event.COMPLETE, onUploadComplete); 
urlLoader.addEventListener(IOErrorEvent.IO_ERROR, onUploadError); 

NextFrame.addCallback(function() { 
    urlLoader.load(urlRequest); 
}); 

उत्तर

13

यह संभव है कि contentType कि आप किस डेटा भेजने का उल्लेख नहीं करता हो सकता है, लेकिन आप क्या डेटा प्राप्त करने के। requestHeaders स्थापित करने के लिए प्रयास करें, कि काम करना चाहिए:

urlRequest.requestHeaders.push(new URLRequestHeader('Content-type', 'multipart/form-data')); 

इसके अलावा, मैं जहां अपनी परियोजनाओं में से एक में कोड का एक टुकड़ा मिला है। कोड काम करता है और POST का उपयोग कर सर्वर पर कुछ बाइनरी जेपीईजी डेटा भेजता है। मैंने इसे कुछ समय पहले छोड़ दिया था और मैं यह नहीं समझा सकता कि मैंने इस तरह से चीजें क्यों कीं, लेकिन शायद यह मदद करता है। मैं चिपकाने कर रहा हूँ के रूप में है: (सब कुछ और कुछ यथावत रही)

function sendData(submitPath:String, descriere:String):void { 
    // building the url request for uploading the jpeg to the server 
    var header:URLRequestHeader = new URLRequestHeader('Content-type', 'application/octet-stream'); 
    var jpgURLRequest:URLRequest = new URLRequest(submitPath+'/id/'+player.id+'/path/'+player.contentPath.replace('/','')+'/width/'+player.videoWidth+'/height/'+player.videoHeight+'/descriere/'+descriere+'/timp/'+time); 
    jpgURLRequest.requestHeaders.push(header); 
    jpgURLRequest.method = URLRequestMethod.POST; 
    jpgURLRequest.data = screenShot; 

    // sending the data to the server 
    var sender:URLLoader = new URLLoader(); 
    sender.load(jpgURLRequest); 
} 
+1

आपको बहुत बहुत धन्यवाद! मैं कल रात घंटों तक फंस गया था ... मुझे कुछ सामान ट्विक करना पड़ा, इसलिए मेरा जवाब देखें कि यह कैसे काम करता है – Cameron

+0

आपका स्वागत है। हाँ, सीमा के बारे में जानना अच्छा है। सादर। – evilpenguin

+0

आपको बहुत बहुत धन्यवाद ... मैं शायद ही कभी फ़्लैश देव करता हूं, लेकिन मुझे एक अपलोडर अपडेट करना आवश्यक था, और अंत में मुझे बचाया :) – will

8

बस पूर्णता 'खातिर, यहाँ कैसे मैं अपने URLRequest वस्तु की स्थापना समाप्त हो गया है:

urlRequest.method = URLRequestMethod.POST; 
urlRequest.data = UploadPostHelper.getPostData('filename', pngFile); 
urlRequest.requestHeaders.push(new URLRequestHeader('Cache-Control', 'no-cache')); 
urlRequest.requestHeaders.push(new URLRequestHeader('Content-Type', 'multipart/form-data; boundary=' + UploadPostHelper.getBoundary())); 

कुंजी, जैसा कि बुराई पेंगुइन द्वारा इंगित किया गया था, सामग्री को सेट नहीं करना था, लेकिन इसे शीर्ष पर रखें। केवल 'मल्टीपार्ट/फॉर्म-डेटा' का उपयोग करते हुए, मुझे सर्वर की तरफ अमान्य पोस्ट सीमाओं के बारे में एक त्रुटि मिली, इसलिए मैंने फ़ाइल अपलोड के लिए वैध सीमा और POST बॉडी बनाने के लिए a class called UploadPostHelper का उपयोग कर समाप्त कर दिया।

यह रहस्यमय सुरक्षा त्रुटि को तय करता है (मुझे अभी भी पता नहीं क्यों हुआ), और अपलोड के लिए बहुत लंबा इंतजार है।

यह ध्यान दिया जाना चाहिए कि अपलोडपोस्टहेल्पर का उपयोग करने के लिए उदाहरण कोड में URLRequest ऑब्जेक्ट की contentType प्रॉपर्टी सेट करना शामिल है, और यह स्पष्ट रूप से कुछ लोगों के लिए काम करता है, लेकिन मेरे मामले में नहीं।

4

मुझे एक ही समस्या थी। PHP स्क्रिप्ट को सबमिट करते समय यह ठीक काम करता था, लेकिन एएसपी स्क्रिप्ट के लिए नहीं। सामग्री प्रकार को एक अनुरोध में ले जाने के बाद, यह सही ढंग से काम करता है। यहां मेरा कोड है:

// Object containing form fields 
var formdata = new Object(); 
formdata.Email = textArray[8].text; 

//URLRequest containing the form fields and the attached image 
var urlRequest : URLRequest = new URLRequest(url); 
urlRequest.method = URLRequestMethod.POST; 
urlRequest.data = UploadPostHelper.getPostData(imageName, imageByteArray, formdata); 
urlRequest.requestHeaders.push(new URLRequestHeader('Cache-Control', 'no-cache')); 
urlRequest.requestHeaders.push(new URLRequestHeader('Content-Type', 'multipart/form-data; boundary=' + UploadPostHelper.getBoundary())); 

//URLLoader to load the request 
var urlLoader : URLLoader = new URLLoader(); 
urlLoader.dataFormat = URLLoaderDataFormat.BINARY; 
urlLoader.load(urlRequest); 
संबंधित मुद्दे