PHP에서 진행률 표시 줄 업로드


82

누구든지 PHP에서 업로드 진행률 표시 줄을 얻는 방법을 알고 있습니까? 사진 앨범 업 로더 용 코드를 작성하려고합니다. 사진이 업로드되는 동안 진행률 표시 줄을 표시하고 싶습니다.

나는 PHP를 처음 접하기 때문에 그것에 대한 모든 것을 알지 못합니다.


답변:


70

이것은 지금까지 인터넷 검색 및 스크립트 시도 후 가장 간단하고 가장 좋은 업 로더입니다.

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

APC 또는 기타 외부 PHP 라이브러리가 필요하지 않으며 공유 호스트에서 파일 진행 피드백을받을 수 있으며 html5 드래그 앤 드롭 (개인적으로 테스트되지 않은) 및 여러 파일 업로드를 지원한다고 주장합니다.


11
대신 이것을 사용하고 싶을 것입니다. github.com/valums/file-uploader- 같은 저자.
Michael Reed 2011

5
그리고 파일 업로드 진행 상황을 확인하기 위해 PHP가 제공하는 세션 업로드 진행률 을 참조하십시오 .
hakre

6
@jpeskin은 개발자에게 불공평합니다. 당신이 "그들에게 돈을 주겠다"고해서 그들이 당신을 위해 일하도록 어떤 종류의 매춘부처럼 그들을 강요하지는 않습니다. 디버그 방법을 알 수 없다면, 나는 당신 자신이 아닌 다른 사람에게 손가락을 가리 키지 않을 것입니다. 인터넷에서 찾은 소프트웨어는 "있는 그대로"제공되므로 다른 사람을 때리지 마십시오. 도와 주려고하는 것 외에는 아무것도하지 않습니다.
sucitivel

3
@sucitivel 더 자세히 설명하자면, 저는 지불을 제안했고 그는 수락 한 다음 문제를 겪으면서 우리가 본 모든 버그를 문서화 한 다음 모든 이메일에 대한 응답을 중단했습니다 (단순히 정중 한 이메일, 상태 업데이트 요청 및 그는 여전히 작업에 관심이있었습니다.) 나는 돈을 위해 일할 의무가있는 사람을 생각하지 않는다. 개발자의 가용성 및 / 또는 프리랜서 작업에 대한 관심에 대해 알고 싶은 다른 사람들을위한 관찰 데이터 포인트 일뿐입니다. 프로젝트가 분기 되었기 때문에 개발자가 유지 관리에 대한 관심을 잃고 있음을 느끼는 사람은 저뿐이 아닙니다.
jpeskin

5
blueimp.github.com/jQuery-File-Upload- 정말 잘 작동합니다. 적어도 그와 같은 I 그것은) = 우분투하에 후행되지 않는
BeRocket

13

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

Rasmus Lerdorf (PHP 창시자)는 YUI (아, 여기에 PHP 소스 )를 사용한 샘플 을 가지고 있습니다.

여기에서 설명서를 참조 하십시오 .


동일하거나 PHP 소스 링크가 더 이상 작동하지 않습니다. 대체 링크가 있습니까?
supersan

@supersan이 답변은 매우 오래되었습니다. APC는 죽었고 Session Upload API는 이제 별개입니다 . 서버가 FastCGI를 사용하는 경우에도 작동하지 않습니다 ... 요즘 보안상의 이유로 대부분 수행합니다.
Powerlord

13

필자가 아는 한 순수한 PHP 업로드 진행률 표시 줄이나 PHP 작동 방식 때문에 PHP / Javascript 업로드 진행률 표시 줄조차도 불가능하다는 점을 유감스럽게 생각합니다. 가장 좋은 방법은 어떤 형태의 플래시 업 로더를 사용하는 것입니다.

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

편집 : 이것은 더 이상 사실이 아닙니다. 2010 년이었습니다.


13
왜 세 개의 반대표가 있습니까? 사실이며 완전히 정당화되지 않았습니다. 나는 누구에게나 네이티브 PHP에서 실행되는 진행률 표시 줄을 보여줄 수 있고, 추가 확장 / 아파치 모듈 / 펄 스크립트 / 기타 작업이 필요하지 않습니다.
Pekka

1
2011 년이었고 이제 HTML5 덕분에 가능해졌습니다. 여기에서 첫 번째 응답을 참조하십시오. stackoverflow.com/questions/76976/…
Zarel 2011-06-16

10
글쎄, 2012 년이고 XMLHttpRequest를 통한 HTML5의 파일 업로드는 모든 주요 브라우저에서 여전히 사용할 수 없습니다.
Damien B

3
@Pekka 웃 사실이 아닙니다. APC가 설치되어 있다면 (그리고 그래야만한다면) 완전히 기본적으로 PHP에서 할 수 있으며 자바 스크립트도 없습니다.
Ariel

2
@Pekka 웃 PHP에서 세션 정보를 사용한 업로드는 말할 것도없고> = 5.4.
Wookie88 2013 년

8

나에게 잘 작동하는 하나의 PHP-ish (5.2+) 및 no-Flash 방식 :

먼저 "uploadprogress"확장을 시작하고 실행하는 방법을 설명하는 게시물을 .

그런 다음 파일을 업로드하는 양식이 포함 된 페이지에서 다음 iframe을 만듭니다.

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

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

uploadprogress.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> 2 개)을 추가 할 수 있습니다. 업로드 진행률이있는 iframe은 업로드가 진행되는 동안에 만 자연스럽게 작동하며 양식이 제출되고 브라우저가 다음 페이지로 다시로드되면 표시되는 수명이 종료됩니다.


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

4

업로드 진행률 표시 줄의 구현은 간단하며 추가 PHP 확장, JavaScript 또는 Flash가 필요하지 않습니다. 하지만 PHP 5.4 이상이 필요합니다. .

지시문 session.upload_progress.enabledOnin 으로 설정하여 업로드 진행 정보 수집을 활성화해야 합니다 .php.ini .

그런 다음 다른 파일 입력 바로 앞에 숨겨진 입력을 HTML 업로드 양식에 추가합니다 . name숨겨진 입력의 HTML 속성 은 session.upload_progress.namefrom 지시문의 값과 같아야합니다 php.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업로드 상태 정보로 채워질 슈퍼 글로벌 구조 에 새 키를 만들어야합니다 . 키가 연결 name되고value 숨겨진 입력입니다.

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 및 사용자에게 제공되는 정보를 사용하여 예를 들어 매초 주기적으로 호출 할 수 있습니다.

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

자세한 정보, 추가 설정 및 사용자 의견은 PHP 설명서를 참조하십시오 .


2

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

  • 무료 (BSD 라이선스)
  • 국제화 가능
  • 크로스 브라우저 호환
  • APC를 설치할지 여부를 선택할 수 있습니다 (진행률 표시 줄을 낮추거나 진행률 표시 줄을 결정).
  • dojo 템플릿 메커니즘을 사용하므로 사용자 정의 가능한 모양입니다. CSS에 따라 te 템플릿에 클래스 / ID를 추가 할 수 있습니다.

재미있게


2

HTML5가 소개 파일 업로드 API를 사용하면 파일 업로드의 진행 상황을 모니터링 할 수 있지만 이전 버전의 브라우저를 위해 거기 plupload 특히 모니터 파일 업로드 및 그들에 대한주고 정보를 제작하는 프레임 워크입니다. 또한 모든 브라우저에서 작동 할 수 있도록 많은 콜백이 있습니다.


2

Gears 및 HTML5에는 HttpRequestAJAX를 통해 파일 업로드를 제출하기위한 진행 이벤트가 개체에 있습니다.

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

다른 사람들이 이미 답변 한 다른 옵션은 다음과 같습니다.

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

기술적으로 YouTube 업로드와 유사한 네 번째 옵션이 있습니다. Gears 또는 HTML5에서는 blob을 사용하여 파일을 작은 청크로 분할하고 각 청크를 개별적으로 업로드 할 수 있습니다. 각 청크가 완료되면 진행 상태를 업데이트 할 수 있습니다.


1

진행률 표시 줄을 만들려면 Javascript를 사용해야합니다. 간단한 Google 검색을 통해 WebAppers Simple Javascript Progress Bar with CSS .

Dojo 파일 업로드 진행률 표시 줄 위젯 은 Dojo Javascript 프레임 워크를 사용하는 또 다른 옵션입니다.

편집 : 많은 수의 이미지 (예 : 사진 앨범)를 업로드하고 PHP 스크립트에 게시한다고 가정하면 javascript를 사용하여 게시물에서 결과를 다시 읽고 업로드 된 이미지 수에 따라 진행률 표시 줄을 업데이트 할 수 있습니다. / 총 이미지 수. 이것은 각 게시물이 완료된 후에 만 ​​업데이트하는 부작용이 있습니다. 여기 에서 JS로 게시하는 방법에 대한 정보를 확인 하세요 .


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

1

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

다른 방법은 iframe을 사용해야하며,이를 통해 PHP는 파일이 얼마나 업로드되었는지 확인합니다. 그러나 숨겨진 iframe은 종종 사용자 컴퓨터에 악성 데이터를 전송하는 데 사용되기 때문에 일부 브라우저 애드온에 의해 차단 될 수 있습니다.

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


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

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

실제로, 그들은 iframe을 사용하지만 어떤 경우에도 차단 될 수 있다고 언급하지 않습니다. 아니면 내가 놓친 적이 있습니까?
ya23

죄송합니다. 질문하려는 내용을 잘못 읽었습니다. 아니요, iframe을 직접 차단하는 브라우저의 예는 제공 할 수 없습니다. iframe을 차단하는 noscript와 같이 사람들이 사용하는 애드온을 생각하고있었습니다. 향후 참조를 위해 게시물의 텍스트를 업데이트했습니다.
Ali Lown
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.