2009-05-11 7 views
76

PHP에서 업로드 진행률 막대를 얻는 방법을 아는 사람이 있습니까? 사진 앨범 업 로더 용 코드를 작성하려고합니다. 사진을 업로드하는 동안 진행률 표시 줄을 표시하고 싶습니다.PHP의 진행률 막대 업로드

나는 php에 상당히 익숙하지 않기 때문에 그것에 대해 모든 것을 모른다.

+0

http : // stackoverflow.co.kr/questions/10477135/간단한 크로스 브라우저 - jquery - PHP와 함께 파일 업로드 - 진행률 표시 줄/10477249 # 10477249 –

답변

68

재미 그것은 APC 또는 기타 외부 PHP 라이브러리를 필요로하지 않습니다

https://github.com/FineUploader/fine-uploader

을 발견했습니다, 나는 공유 호스트 파일의 진행 상황 피드백을 얻을 수 있으며, HTML5의 드래그 앤 드롭 (개인적으로 테스트되지 않은) 및 다중를 지원하기 위해 주장 파일 업로드. 나를 위해 잘 작동 (5.2 이상) &없는 플래시 방법

+10

당신은 이것을 믿고 싶습니다 : https://github.com/valums/file-uploader - 같은 저자. –

+5

그리고 PHP가 제공하는 [Session Upload Progress] (http://www.php.net/manual/en/session.upload-progress.php)에서 파일 업로드를위한 진행 상황을 확인할 수 있습니다. – hakre

+1

@hakre에서 언급 한 세션 업로드 진행 기능에는 아직 베타 버전 인 PHP 5.4가 필요합니다. 그러나 비슷한 기능이 PHP 5.2의 [Alternative PHP Cache] (http://us3.php.net/manual/en/ref.apc.php)에서 소개되었습니다. – arlomedia

13

순수한 PHP 업로드 진행률 표시 줄 또는 심지어 PHP/Javascript 업로드 진행률 표시 줄은 PHP 작동 방식 때문에 불가능하다고 말한 것이 유감입니다. 가장 좋은 방법은 어떤 형태의 플래시 업 로더를 사용하는 것입니다.

AFAIK 이것은 모든 슈퍼 글로블이 채워질 때까지 스크립트가 실행되지 않기 때문입니다. 여기에는 $ _FILES가 포함됩니다. PHP 스크립트가 호출 될 때까지 파일이 완전히 업로드됩니다.

편집 : 이것은 더 이상 적용되지 않습니다.

+13

왜 세 downvotes? 사실이고 그들은 완전히 정당화되지 않았습니다. 나에게 네이티브 PHP에서 실행되는 진행 표시 줄을 보여줄 누군가를 감히하고 추가 확장/아파치 모듈/perl 스크립트/다른 것들을 필요로하지 않습니다. –

+1

글쎄, 2011 년이고 HTML5 덕분에 가능해졌습니다. 첫 번째 응답을 참조하십시오. http://stackoverflow.com/questions/76976/how-to-get-progress-from-xmlhttprequest – Zarel

+10

글쎄, 2012 년이며 XMLHttpRequest를 통한 HTML5의 파일 업로드는 모든 주요 브라우저에서 아직 사용할 수 없습니다. . –

1

진행률 표시 줄을 만들려면 Javascript를 사용해야합니다. 단순한 Google 검색을 통해이 기사에 도달했습니다 : WebAppers Simple Javascript Progress Bar with CSS.

Dojo File Upload Progress Bar Widget은 Dojo Javascript 프레임 워크를 사용하는 또 다른 옵션입니다.

편집 : 사진 앨범과 같은 다수의 이미지 업로드를 가정하고 PHP 스크립트에 게시하면 JavaScript를 사용하여 게시물에서 결과를 읽고 다시 업로드 된 이미지 수/총 이미지 수. 이것은 각 게시물이 완료된 후에 만 ​​갱신하는 부작용이 있습니다. JS 게시 방법에 대한 정보는 here을 확인하십시오.

+6

-1 Javascript 진행률 표시 줄은 좋지만 볼 수있는 한 파일 업로드와는 아무 관련이 없습니다. 그리고 Dojo 업로드 진행률 표시 줄은 PHP에 대한 인터페이스를 제공하지 않습니다. 내가 틀렸다면 저를 고쳐주세요. –

1

PHP/ajax 진행률 표시 줄을 수행 할 수 있습니다. (배에서 Html_Ajax 라이브러리를 확인하십시오.) 그러나 이것은 PHP에 사용자 정의 모듈을 설치해야합니다.

다른 방법을 사용하려면 파일의 양이 업로드 된 것을보기 위해 PHP를 통해 iframe을 사용해야합니다. 그러나 숨겨진 iframe은 종종 악의적 인 데이터를 사용자 컴퓨터로 보내는 데 사용되기 때문에이 숨겨진 iframe은 일부 브라우저 애드온에 의해 차단 될 수 있습니다.

가장 좋은 방법은 서버를 제어 할 수없는 경우 플래시 진행률 표시 줄을 사용하는 것입니다.

+0

일부 부가 기능은 iframe을 차단하지만 브라우저는 차단할 수 있습니까? 예를 들어 줄 수 있습니까? – ya23

+0

"ajax php file upload"라는 용어를 사용하면 iframe을 사용하여 상위 5 개 결과 중 4 개가 반환됩니다 (5 번째 페이지가로드되는지는 확실하지 않음 (페이지가로드되지 않음)). 각 사이트의 예를 살펴보십시오. –

+0

실제로, 그들은 iframe을 사용하지만 어떤 경우에도 차단 될 수 있음을 언급하지 않습니다. 또는 나는 그것을 놓쳤는가? – ya23

12

APC이 설치되어있는 경우 업로드 진행을위한 콜백 훅이 있습니다.

Rasmus Lerdorf (PHP 작성자)는 YUI를 사용하여 sample (PHP source)을 사용하고 있습니다.

the documentation here을 참조하십시오.

+0

동일하거나 PHP 소스 링크가 더 이상 작동하지 않습니다. alt 링크를 사용하십시오. – supersan

+0

@supersan이 답변은 매우 오래되었습니다. APC는 죽었고 Session Upload API는 [별도의 것] (http://php.net/manual/en/session.upload-progress.php)입니다. 또한 서버가 FastCGI를 사용하는 경우에는 작동하지 않습니다 ... 요즘 대부분 보안상의 이유로 인해 발생합니다. – Powerlord

0

플래시 업로드가 작업을 수행합니다. 원하는 파일을 업로드합니다. 그러나 저보다 더 많은 요구가 있습니다. 업로드가 완료되기 전에 파일 이름을 변경해야합니다. 이것은 FIXED 변수를 추가하는 경우에만 플래시 솔루션에서도 가능합니다. 내가 파일 이름에 사용자 ID를 추가해야하고 그것을 할 방법이 없습니다.

2

기어 및 HTML5는 AJAX를 통해 파일 업로드를 제출하는 HttpRequest 개체에 progress 이벤트가 있습니다.이미 다른 사람이 대답

http://developer.mozilla.org/en/Using_files_from_web_applications

귀하의 다른 옵션은 다음과 같습니다

  1. 플래시 기반 업 로더.
  2. 자바 기반 업 로더.
  3. 두 번째 comet-style 웹 서버에 요청하거나받은 데이터의 크기를보고하는 스크립트. Lighttpd와 같은 일부 웹 서버는 외부 스크립트 또는 프로세스를 호출하는 오버 헤드를 줄이기 위해이 작업을 수행하는 모듈을 제공합니다.

은 기술적으로는 작은 조각으로 파일을 분할하고 개별적으로 각 청크를 업로드하는 모양을 사용할 수있는 기어 또는 HTML5와 유튜브 업로드 유사한 규정 옵션,있다. 각 청크가 완료되면 진행 상태를 업데이트 할 수 있습니다.

2

또 다른 업 로더 전체 JS : http://developers.sirika.com/mfu/

  • 자유 (BSD 라이선스)
  • Internationalizable
  • 크로스 브라우저 호환
  • 당신은 확정 VS APC 여부 (underterminate 진행률 표시 줄을 설치하는 선택의 여지가 진행률 표시 줄)
  • Dojo 템플릿 메커니즘을 사용하여 사용자 정의 모양으로 표시합니다. 당신은

가지고 당신의 CSS에 따라 테 템플릿에서 클래스/ID를 추가 할 수 있습니다이에 의해 지금까지 설정하는 간단한과 나 '좋은 업 로더 (인터넷 검색 및 스크립트를 시도하는 시간 후)입니다

7

한 PHP 틱 :

먼저, "uploadprogress"연장까지하고 실행하는 방법을 설명 this 게시물을 참조하십시오.

<iframe id="progress_iframe" src="" style="display:none;" scrolling="no" frameborder="0"></iframe> 

다음, 당신의 "제출"버튼이 코드를 추가합니다 :

onclick="function set() { f=document.getElementById('progress_iframe'); f.style.display='block'; f.src='uploadprogress.php?id=<?=$upload_id?>';} setTimeout(set);" 

그런 다음에서 파일을 업로드하는 양식을 포함하는 페이지에서 다음은 iframe을 만들

이제 폼에 숨겨진 iframe이 표시되어 "제출"을 클릭하여 파일 업로드를 시작하면 uploadprogress.php의 내용이 표시됩니다. $ upload_id는 양식의 숨겨진 필드 "UPLOAD_IDENTIFIER"값으로 사용중인 것과 동일해야합니다.

업로드 진행 중입니다.PHP 자체가 (수정하고 사용자의 요구에 적응)이 같은 대한 보인다 : 자기 새로 고침마다 두 번째

<html> 
<head> 
<META HTTP-EQUIV='REFRESH' CONTENT='1;URL=?id=<?=$_GET['id']?>'> 
</head> 
<body> 
Upload progress:<br /> 
<?php 
    if(!$_GET['id']) die; 
    $info = uploadprogress_get_info($_GET['id']); 
    $kbytes_total = round($info['bytes_total']/1024); 
    $kbytes_uploaded = round($info['bytes_uploaded']/1024); 
    echo $kbytes_uploaded.'/'.$kbytes_total.' KB'; 
?> 
</body> 
</html> 

참고. 원하는 경우 여기에 좋은 시각적 진행률 막대를 추가 할 수 있습니다 (예 : <div> div 중첩 된 두 가지 색상). 업로드 진행 상태의 iframe은 자연스럽게 업로드가 진행되는 동안에 만 작동하며 양식이 제출되고 브라우저가 다음 페이지로 다시로드되면 표시 수명이 종료됩니다.

+0

어떻게 PHP에서 $ _FILES없이 파일을 업로드 할 수 있습니까? –

2

HTML5는 파일 업로드 진행률을 모니터링 할 수 있지만 이전 브라우저의 경우 파일 업로드를 모니터링하고 해당 정보를 제공하는 프레임 워크가 plupload입니다. 게다가 모든 콜백에서 콜백이 가능하므로 모든 브라우저에서 작동 할 수 있습니다.

3

업로드 진행률 막대의 구현은 쉽고 추가 PHP 확장, JavaScript 또는 플래시가 필요하지 않습니다. 그러나 PHP 5.4 이상 필요합니다.

session.upload_progress.enabledOnphp.ini으로 설정하여 업로드 진행 정보를 수집하도록 설정해야합니다.

그런 다음 HTML 업로드 양식에 숨겨진 입력을 앞에 추가하고 다른 파일 입력을 추가하십시오. 숨겨진 입력의 HTML 속성 namesession.upload_progress.namephp.ini (결국 앞에 session.upload_progress.prefix)의 값과 같아야합니다. value 속성은 사용자에게 달려 있으며 세션 키의 일부로 사용됩니다. 수는 다음과 같습니다

HTML 양식 :이 양식을 보낼 때

<form action="upload.php" method="POST" enctype="multipart/form-data"> 
    <input type="hidden" name="<?php echo ini_get('session.upload_progress.prefix').ini_get('session.upload_progress.name'); ?>" value="myupload" /> 
    <input type="file" name="file1" /> 
    <input type="submit" /> 
</form> 

, PHP는 업로드 상태 정보로 채워됩니다 $_SESSION 자동 전역 구조에서 새 키를 생성해야합니다. 키는 숨겨진 입력의 namevalue을 연결합니다. 당신은 인구가 업로드 정보에 좀 걸릴 수 있습니다 PHP에서

는 :

var_dump($_SESSION[ 
    ini_get('session.upload_progress.prefix') 
    .ini_get('session.upload_progress.name') 
    .'_myupload' 
]); 

출력은 다음과 유사하게 보일 것 :

$_SESSION["upload_progress_myupload"] = array(
    "start_time" => 1234567890, // The request time 
    "content_length" => 57343257, // POST content length 
    "bytes_processed" => 54321, // Amount of bytes received and processed 
    "done" => false,    // true when the POST handler has finished, successfully or not 
    "files" => array(
    0 => array(
     "field_name" => "file1", // Name of the <input /> field 
     // The following 3 elements equals those in $_FILES 
     "name" => "filename.ext", 
     "tmp_name" => "/tmp/phpxxxxxx", 
     "error" => 0, 
     "done" => false,   // True when the POST handler has finished handling this file 
     "start_time" => 1234567890, // When this file has started to be processed 
     "bytes_processed" => 54321, // Number of bytes received and processed for this file 
    ) 
) 
); 

진행률 표시 줄을 만드는 데 필요한 모든 정보가있다 - 업로드가 진행중인 경우 정보가 있습니다. 정보는 이미 전송 된 바이트 수와 이미 전송 된 바이트 수입니다.

업로드 진행 상황을 사용자에게 알리려면 업로드하는 것과 다른 PHP 스크립트를 작성해야합니다.이 스크립트는 세션의 업로드 정보 만보고 JSON 형식으로 반환합니다. 이 스크립트는 AJAX와 사용자에게 제공된 정보를 사용하여 주기적으로 호출 할 수 있습니다 (예 : 1 초마다).

$_SESSION[$key]['cancel_upload']true으로 설정하여 업로드를 취소 할 수도 있습니다.

자세한 내용은 추가 설정 및 사용자 의견은 PHP manual을 참조하십시오.