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.enabled을 Onin 으로 설정하여 업로드 진행 정보 수집을 활성화해야 합니다 .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.