과거에 내가 한 가장 간단하고 강력한 방법은 양식으로 숨겨진 iFrame 태그를 타겟팅하는 것입니다. 그러면 페이지를 다시로드하지 않고 iframe 내에서 제출합니다.
플러그인, JavaScript 또는 HTML 이외의 다른 형태의 "마법"을 사용하지 않으려는 경우입니다. 물론 이것을 JavaScript와 결합하거나 무엇을 가질 수 있습니까?
<form target="iframe" action="" method="post" enctype="multipart/form-data">
<input name="file" type="file" />
<input type="button" value="Upload" />
</form>
<iframe name="iframe" id="iframe" style="display:none" ></iframe>
onLoad
서버 오류 또는 성공 응답 에 대한 iframe의 내용을 읽은 다음 사용자에게 출력 할 수도 있습니다.
Chrome, iFrame 및 onLoad
-참고-업로드 / 다운로드시 UI 차단기를 설정하는 방법에 관심이있는 경우 계속 읽으십시오.
현재 Chrome은 파일 전송에 사용될 때 iframe에 대한 onLoad 이벤트를 트리거하지 않습니다. Firefox, IE 및 Edge는 모두 파일 전송시 onload 이벤트를 발생시킵니다.
Chrome에서 작동하는 유일한 해결책은 쿠키를 사용하는 것입니다.
기본적으로 업로드 / 다운로드가 시작될 때이를 수행하려면 다음을 수행하십시오.
- [클라이언트 측] 쿠키의 존재를 찾기위한 간격을 시작합니다
- [서버 측] 파일 데이터로 필요한 작업을 수행하십시오.
- [서버 측] 클라이언트 측 간격을위한 쿠키 설정
- [클라이언트 측] 간격은 쿠키를보고 onLoad 이벤트처럼 사용합니다. 예를 들어 UI 차단기를 시작한 다음 onLoad (또는 쿠키가 만들어 질 때) UI 차단기를 제거 할 수 있습니다.
이것을 위해 쿠키를 사용하는 것은 추악하지만 작동합니다.
다운로드 할 때 Chrome 의이 문제를 처리하기 위해 jQuery 플러그인을 만들었습니다. 여기에서 찾을 수 있습니다
https://github.com/ArtisticPhoenix/jQuery-Plugins/blob/master/iDownloader.js
동일한 기본 원칙이 업로드에도 적용됩니다.
다운로더를 사용하려면 (분명히 JS 포함)
$('body').iDownloader({
"onComplete" : function(){
$('#uiBlocker').css('display', 'none'); //hide ui blocker on complete
}
});
$('somebuttion').click( function(){
$('#uiBlocker').css('display', 'block'); //block the UI
$('body').iDownloader('download', 'htttp://example.com/location/of/download');
});
그리고 서버 측에서 파일 데이터를 전송하기 직전에 쿠키를 만듭니다.
setcookie('iDownloader', true, time() + 30, "/");
플러그인은 쿠키를 본 다음 onComplete
콜백 을 트리거합니다 .