파일이 브라우저에 제공되었는지 여부를 감지합니까? .. Kinda
-
05-07-2019 - |
문제
Window.Location을 PHP 파일로 설정하는 버튼이있어 피드를 생성 한 다음 다운로드합니다. 그러나 피드에 넣은 데이터로 인해 파일의 크기가 다양하므로 버튼 클릭부터 파일 대화 상자가 팝업되는 때때로 시간이 걸릴 수 있습니다.
내가 할 수있는 것은 버튼을 클릭하고 대화 상자 / 파일이 완료 될 때까지로드를 표시하는 것입니다.
어떤 아이디어라도 멋질 것입니다!
건배
해결책
RSS가 원하는 스크립트를 생성하는 이미지를 보여주십시오 (출력 이미지의 HTML, 출력 버퍼를 플러시하고 데이터 생성을 시작하십시오). 데이터 생성이 끝나면 다음과 같습니다.
<?php
print '<script>window.location = "http://www.newlocation.com"</script>'
그게 다야.
다른 팁
왜 파일의 크기를 전혀 확인 해야하는지 잘 모르겠습니다. Ajax를 사용하여 동적으로 GET/POST를 수행하고, 당신이하고있는 모든 일이 일어나고있는 동안 로딩 아이콘을 보여 주려고하는 경우, 비동기 활동 표시기를 던지는 것은 상당히 간단합니다. 예를 들어 jQuery와 함께 :
$("#loading").ajaxStart(function(){
$(this).show();
});
$("#loading").ajaxStop(function(){
$(this).hide();
});
$("#feeds").load("feeds.php?id=89734258972347895");
위의 코드는 비동기 요청이 시작되고 중지 될 때 표시하고 숨기기 위해 ID "로드"가있는 DOM 객체를 설정합니다. .LOAD (URL) URL의 내용을 div #feeds에로드합니다. Content-Disposition : PHP를 사용하여 첨부 파일 헤더를 설정하는 경우 파일 다운로드 창이 Div에 비동기로로드 되었더라도 자동으로 시작됩니다. 물론 jQuery 없이도 가능합니다. 물론 브라우저 호환성 JavaScript가 많이 있으며 AjaxStart 및 AjaxStop 이벤트에 간단히 구독하여로드 IMG를 표시하고 숨기는 것만 큼 쉽지 않습니다.
조롱
Window.location을 설정하기 전에 GIF와 함께 숨겨진 div를 표시 할 수 있습니다.
구식이지만 서버 푸시로 매우 쉽게 수행 할 수 있습니다.
<?php
$separator = "end_of_section_marker";
header('Content-type: multipart/x-mixed-replace;boundary=$separator');
print "\n--$separator\n";
print "Content-type: text/html\n\n";
// Send placeholder message here
print "--$separator\n";
ob_flush();
flush();
// Start long processing here
print "Content-type: text/html\n\n";
// send data here
print "--$separator--\n";
?>
보내는 데이터에 대한 컨텐츠 유형을 조정하기 만하면됩니다. $ 분리기는 전송중인 데이터에 나타나지 않는 한 값이 될 수 있습니다.
내가 과거에 사용한 방법은 이와 같이 작동합니다 ...
- Window.location을로드 페이지로 설정하고 쿼리 스트링의 대상 페이지를 전달하십시오. 로딩 페이지에는 애니메이션 GIF 또는 처리가 진행되고 있음을 입증하는 것을 선호하는 모든 것을 표시해야합니다. 로딩 페이지는 쿼리 스트링에 전달 된 대상 페이지로 즉시 리디렉션해야합니다 (다른 해당 쿼리 스트링 매개 변수와 함께).
편집 : 로딩 페이지는 javaScript를 사용하여 대상 페이지로 리디렉션해야합니다 (쿼리 스트링에 제공된 URL에 대한 set window.location). 서버 측에서 리디렉션하면 로딩 페이지가 표시되지 않기 때문에 이것은 중요한 점입니다.
편집 2 :로드 페이지가 PHP 파일 인 경우, 다운로드 된 파일의 크기를 확인하고 사용자에게 예상 다운로드 시간 (애니메이션 "로드"GIF) 또는 What Not을 표시 할 수 있습니다.
- 대상 페이지는 버퍼링 활성화로 렌더링해야합니다 (콘텐츠를 렌더링하기 전에 OB_START () 호출). 버퍼링이 활성화되면 전체 페이지가 렌더링 될 때까지 브라우저에 전송되지 않습니다. 한편 1 단계의 로딩 페이지는 계속 표시됩니다.
다운로드하는 파일의 정확한 크기를 찾으려면 서버에 통신하려면 Ajax를 사용해야합니다. 그런 다음 테스트 할 것이 있습니다. 클라이언트 측에서만 예상 페이로드의 크기를 알 수있는 방법은 없습니다.
Iframe을 사용하여 피드를로드 한 다음 간격을 사용하여 iframe/문서의 준비 상태를 확인할 수 있습니까? 그래서 과정은 다음과 같습니다.
- 너비와 높이가 100% 인 iframe과 iframe 위의 하중을 포함하는 창을로드하십시오.
- iframe.contentwindow.document.readystate 속성에 대한 타이머 검사를 설정하십시오
- ReadyState == 완료되면 파일 저장 대화 상자를 표시하십시오.
한 가지 단점은 대부분의 브라우저의 경우 PHP 파일이 동일한 도메인에 있어야한다는 것입니다 (즉, iframe의 ReadyState 속성을 확인할 수 있음).