6

URLRequest와 함께 URLLoader 클래스를 사용하여 일부 이진 데이터, 특히 PNG 이미지를 나타내는 ByteArray를 서버에 업로드하려고합니다.URLLoader를 사용할 때 예기치 않은 플래시 보안 예외

URLRequest의 contentType 속성을 기본값 대신 'multipart/form-data'로 설정하면 urlLoader.load()을 호출하면 보안 예외가 발생합니다.

contentType 속성을 기본값으로두면 제대로 작동하지만 파일을 서버에 업로드하는 데 오랜 시간 (PNG 파일의 길이에 비례)이 걸립니다.

내 질문에이 보안 예외가 발생합니다. 어떻게 피할 수 있습니까?

내 SWF는 로컬 파일 시스템 (정확하게는 Google App Engine 개발 서버)이 아니라 개발 서버에서 제공됩니다. 그러나 당신이받을 수있는 데이터로,

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를 사용하여 일부 이진 JPEG 데이터를 서버로 보냅니다. 나는 약간의 시간 전에 그것을 썼다. 그리고 나는 내가 물건을 이처럼하는 이유를 설명 할 수 없다. 그러나 아마 도움이 될지도 모른다.

그냥 완전성 '을 위해, 여기에 내가 내 URLRequest 객체를 설정 결국 어떻게
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

sooo so much ... 고맙습니다. 드물게 플래시 개발자는 없지만 업 로더를 업데이트해야합니다. – will

8

(모든 다른 같은 체재) :

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())); 

의 핵심이며, 나는 그것을 붙여 넣기 해요 evilpenguin이 지적한 것처럼 contentType 속성을 설정하지 않고 헤더에 넣는 것이 었습니다. 그러나 'multipart/form-data'를 사용하면 유효하지 않은 POST 경계에 대해 서버 측에서 오류가 발생하므로 a class called UploadPostHelper을 사용하여 파일 업로드를위한 유효한 경계와 POST 본문을 만들었습니다.

이렇게 신비한 보안 오류가 수정되었습니다 (여전히 그 이유는 모르겠습니다). 업로드가 오래 기다렸습니다.

UploadPostHelper를 사용하는 예제 코드에는 URLRequest 객체의 contentType 속성을 설정하는 것이 포함되어 있지만이 방법은 일부 사용자에게는 효과적이지만 내 경우에는 사용할 수 없다는 점에 유의해야합니다.

4

나는 동일한 문제가있었습니다. 그것은 PHP 스크립트에 제출할 때 잘 작동하지만 ASP 스크립트에는 제출하지 않습니다. 콘텐츠 형식을 requestHeader로 이동하면 올바르게 작동합니다. 내 코드는 다음과 같습니다.

// 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);