블로그 이미지

카테고리

데꾸벅 (194)
Publisher (39)
Scripter (97)
Programmer (1)
Designer (30)
Integrator (18)
Pattern Searcher (4)
News (2)
강좌 및 번역 (3)

최근에 올라온 글

최근에 달린 댓글

'보안을 위해 Internet Explorer가 이 사이트에서 사용자의 컴퓨터로 파일을 다운로드하는 것을 차단했습니다. 옵션을 보려면 여기를 클릭하십시오.'에 해당되는 글 1건

  1. 2008.04.03 파일다운로드에 따른 플래쉬 링크 에러 5



데꾸벅 플래쉬 때문에 난관에 봉착하다 (쉿~ 댐~..)

같은 페이지내 파일다운로드 링크를 클릭후 플래쉬의 링크를 클릭하면 다음과 같이
"을(를) 다운로드 할 수 없습니다 지정되지 않은 오류입니다"라는 메세지(IE7)를 만났다.
이런 황당한 경우는 처음이라..





그냥 일반 링크를 getURL("URL주소");를 직접사용하면 상관이 없으나 getURL("javascript:자바스크립트함수()"); 로 호출하면 다음과 같은 에러를 만나게 된다.
문제는 flash player9 로 업데이트 되면서 보안이 강화됐기 때문이란다.. ㅡ.,ㅡ;
adobe가 flash를 framework로 밀기로 작정을 하면서 부터 player업그레이들 하기 싫더라니...
살재 getURL("javascript:alert(1111);");은 브라우저의 주소표시줄에 javascript:alert(1111); 을 친것과 마찬가지 효과를 가진다. 그러나 보안이 강화되면서 이것 또한 막히면서 호출이 되지 않는다.
아래에서 자세히 설명하겠지만 ExternalInterface.call은 actionscript2.0 부터 지원하게 되므로 publishing할때 반드시 actionscript2 를 선택해줘야 한다.



[IE7 에러메세지]
사용자 삽입 이미지



[IE6 에러메세지]
사용자 삽입 이미지
IE6에서는 "보안을 위해 Internet Explorer가 이 사이트에서 사용자의 컴퓨터로 파일을 다운로드하는 것을 차단했습니다. 옵션을 보려면 여기를 클릭하십시오."라는 메세지를 뱉어내네.. ㅡ.,ㅡ; 써글것들...

그레이트김 차장님의 블로그에 처음 포스팅된 글을 볼때만 해도 단순 다운로드 서블릿의 문제일거라 생각했는데 일반 파일을 다운로드후 테스트해도 동일한 결과가 나왔다.
각각 버전별 플래쉬로 다시 퍼블리싱하여 테스트한 결과 Flash8로 퍼블리싱한 것/Flash Player9 만 문제를 일으킨다는것도..


getURL을 이용해서 그런것 같은데...
ExternalInterface.call("외부스크립트메쏘드명","파라미터명");
를 권장한단다.. AS3에서는 getURL을 지원하지 않는다는데..
Adobe에서 플래쉬 플레이어9로 업그레이드 하면서 보안정책상 몇개의 함수를 실행하지 않도록 한것이다.

[레퍼런스참조1, 레퍼런스참조2]





해결책1 :
다운로드 받을때 타겟을 _blank로 잡으면 된다는것...

_top, _self, 다 해봤지만 _blank가 가장 낫다는거..  다만 IE7 이전 버전의 경우 새창이 떠서 문제가 되지만... ㅡ.,ㅡ; 근본적인 문제해결법은 아닌것 같다.

해결책 2 :
아래와 같이 ExternalInterface.call("외부스크립트메쏘드명","파라미터명");을 쓴다. 단 아래 빨간색으로 표시된 부분만 주의해주시길...


HTML소스
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr" />
<title>lodging_menu</title>
<script type="text/javascript">
function techbugJSFunc(codeStr){
 alert(codeStr);
}
</script>
</head>
<body bgcolor="#ffffff">
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0"
 width="213" height="592" id="lodging_menu" align="middle">
<param name="allowScriptAccess" value="always" /> 반드시 always로 해주세요.. sameDomain도 안되네요
<param name="movie" value="techbug.swf" />
<param name="quality" value="high" />
<param name="bgcolor" value="#ffffff" />
<embed src="techbug.swf" quality="high" bgcolor="#ffffff" width="213" height="592" name="techbug" align="middle"
 allowScriptAccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>
</body>
</html>



ActionScript

link = new Array();
link[1] = "LDG_A00000";
link[2] = "LDG_A01000";
link[3] = "LDG_A02000";
link[4] = "LDG_B00000";
link[5] = "LDG_E00000";
link[6] = "LDG_F00000";
link[7] = "LDG_I00000";
link[8] = "GDE_G00000";
link[9] = "LDG_H00000";
frame = new Array();
frame[1] = "_self";
frame[2] = "_self";
frame[3] = "_self";
frame[4] = "_self";
frame[5] = "_self";
frame[6] = "_self";
frame[7] = "_self";
frame[8] = "_self";
frame[9] = "_self";

numOfMenu = 12 ;
defaultY = 17 ;

max = new Array(0,0,0,0,0,0, 0) ;

_global.active = pageNum ;
_global.subActive = subNum ;
_global.over = active ;

for(i=1 ; i<= numOfMenu ; i++ ) {
 this["menu"+i].defaultY = this["menu"+i]._y ;
 this["menu"+i].bg.onRollOver = function() {
  _global.over = this._parent._name.substring(4) ;
 };
 this["menu"+i].bg.onRollOut = this["menu"+i].bg.onDragOut = function() {
  _global.over = active ;
 };
 if(i != numOfMenu) {
  this["menu"+i].bg.onRelease = function() {
   import flash.external.*;
   ExternalInterface.call("techbugJSFunc",link[this._parent._name.substring(4)]);

   //getURL(link[this._parent._name.substring(4)], frame[this._parent._name.substring(4)]);
  };
 }
 this["menu"+i].bg._height = defaultY ;
 if(i != 1) {
  this["menu"+i]._y = this["menu"+i-1].bg._height + this["menu"+i-1]._y ;
 }
 this["menu"+i].onEnterFrame = function() {
  if(over == this._name.substring(4)) {
   this.direction = "next" ;
   this.nextFrame() ;
  } else {
   this.direction = "prev" ;
   this.prevFrame() ;
  }
  if(Number(this._name.substring(4)) > over) {
   this._y += (this.defaultY + max[over -1] - this._y) / 4 ;
  } else {
   this._y += (this.defaultY - this._y) / 4 ;
  }
  if(this._name.substring(4) != numOfMenu) {
   this.bg._height = this._parent[Number(this._name.substring(4)) + 1]._y - this._y + 10;
  } else {
   this.bg._height = 400;
  }
 };
}
this[numOfMenu].bg.useHandCursor = false;


또한 FlashPlayer9에서 <form>태그내에서 쓸때 버그를 해결하기 위해서는 다음과 같이 작성한다.


 function Flash(id, url, width, height) {    
  var str;    
  str = '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="' + width + '" height="' + height + '" id="' + id + '" align="middle">';    
  str += '<param name="allowScriptAccess" value="sameDomain" />';    
  str += '<param name="movie" value="' + url + '" /><param name="quality" value="high" /><param name="bgcolor" value="#ffffff" />';    
  str += '<embed src="' + url + '" quality="high" bgcolor="#ffffff" width="' + width + '" height="' + height + '" id="'+ id +'" name="' + id + '" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />';    
  str += '</object>';      
  document.write(str);      
 
  //Flash의 ExternalInterface가 Form Tag내에서 오류나는 버그를 해결하는 코드    
  eval("window." + id + " = document.getElementById('" + id + "');");

 }




 이달(2008.4월말)에 다시 보안 업뎃 된다는데 어케 바뀔지는 두고봐야 게따.. 다시 바꿀일이 없길 바라믄서...

[스크립트에서 Flash9 에러방지 ]

// 새로고침시 Flash9 ocx 에러 방지
window.onbeforeunload= function() {
 deconcept.SWFObjectUtil.prepUnload();
}

/*ExternalInterface 관련 함수 시작*/
function cleanup() {
 __flash_unloadHandler = function() {
  externalProbSet = true;
  obj = document.getElementsByTagName('OBJECT');
  for (i=0;i<obj.length;i++) {
   var theObj = eval(obj[i]);
   theObj.style.display = "none";
   for (var prop in theObj) {
    if (typeof(theObj[prop]) == "function") {
     theObj[prop]=null
    }
   }
  }
 }
 if (window.onunload != __flash_unloadHandler) {
  __flash_savedUnloadHandler = window.onunload;
  window.onunload = __flash_unloadHandler;
 }
}
window.onbeforeunload=cleanup;
/*ExternalInterface 관련 함수 끝*/

Post by 넥스트리소프트 데꾸벅(techbug)
, |