Tải lên Thanh tiến trình bằng PHP


82

Có ai biết cách lấy thanh tiến trình để tải lên trong php không? Tôi đang cố gắng viết mã cho trình tải lên album ảnh. Tôi muốn một thanh tiến trình hiển thị trong khi tải ảnh lên.

Tôi khá mới với php vì vậy tôi không biết mọi thứ về nó.


Câu trả lời:


70

Cho đến nay, đây là trình tải lên đơn giản nhất và đẹp nhất mà tôi tìm thấy (sau hàng giờ googling và thử các tập lệnh)

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

Nó không yêu cầu APC hoặc bất kỳ thư viện PHP bên ngoài nào khác, tôi có thể nhận phản hồi về tiến trình tệp trên máy chủ được chia sẻ và nó tuyên bố hỗ trợ kéo và thả html5 (chưa được kiểm tra cá nhân) và tải lên nhiều tệp.


11
Thay vào đó, bạn sẽ muốn sử dụng cái này: github.com/valums/file-uploader - cùng một tác giả.
Michael Reed

5
Và vui lòng xem Tiến độ tải lên phiên là những gì PHP cung cấp để có được tiến trình tải tệp lên.
hakre

6
@jpeskin thật không công bằng đối với nhà phát triển. chỉ vì bạn "đề nghị trả tiền cho họ" không bắt buộc họ như một loại gái mại dâm nào đó phải làm việc cho bạn. nếu bạn không thể tìm ra cách để gỡ lỗi nó, thì tôi sẽ không đi chỉ tay vào bất kỳ ai khác ngoài chính bạn-- phần mềm bạn tìm thấy trên internet được cung cấp "nguyên trạng", vì vậy đừng đi lăng mạ những người không làm gì hơn là cố gắng giúp đỡ.
sucitivel

3
@sucitivel Để chi tiết hơn: Tôi đã đề nghị trả tiền và anh ấy chấp nhận, sau đó chúng tôi đã vượt qua khó khăn để ghi lại tất cả các lỗi mà chúng tôi gặp phải và sau đó anh ấy ngừng trả lời bất kỳ và tất cả các email (đơn giản là những email lịch sự, yêu cầu cập nhật trạng thái và liệu anh ấy vẫn quan tâm đến công việc). Tôi không coi bất cứ ai bắt buộc phải làm việc vì tiền. Nó chỉ là một điểm dữ liệu quan sát cho những người khác có thể muốn biết về sự sẵn có của nhà phát triển và / hoặc quan tâm đến công việc tự do. Dự án đã bị chia tách, vì vậy tôi không phải là người duy nhất cảm thấy nhà phát triển mất hứng thú với việc duy trì.
jpeskin

5
blueimp.github.com/jQuery-File-Upload - điều này thực sự hoạt động tốt. Ít nhất tôi như nó vì nó không tụt dưới Ubuntu =)
BeRocket

13

Nếu bạn đã cài đặt APC , nó có một móc gọi lại cho tiến trình tải lên.

Rasmus Lerdorf (người tạo ra PHP) có một ví dụ về điều này bằng cách sử dụng YUI (ồ, đây là nguồn PHP ).

Xem tài liệu tại đây .


Các liên kết nguồn php giống nhau hoặc không còn hoạt động nữa .. bạn có liên kết thay thế nào không?
supersan

@supersan Câu trả lời này rất lỗi thời. APC đã chết và API tải lên phiên hiện là một thứ riêng biệt . Nó cũng không hoạt động nếu máy chủ đang sử dụng FastCGI ... mà hầu hết làm vì lý do bảo mật ngày nay.
Powerlord

13

Tôi rất tiếc phải nói rằng theo hiểu biết của tôi, thanh tiến trình tải lên PHP thuần túy hoặc thậm chí thanh tiến trình tải lên PHP / Javascript là không thể thực hiện được vì cách hoạt động của PHP. Đặt cược tốt nhất của bạn là sử dụng một số dạng trình tải lên Flash.

AFAIK Điều này là do tập lệnh của bạn không được thực thi cho đến khi tất cả các siêu cầu được điền, bao gồm $ _FILES. Khi tập lệnh PHP của bạn được gọi, tệp đã được tải lên đầy đủ.

CHỈNH SỬA: Điều này không còn đúng nữa. Đó là vào năm 2010.


13
Tại sao ba phiếu phản đối? Đó là sự thật và chúng hoàn toàn không có căn cứ. Tôi dám bất cứ ai cho tôi xem một thanh tiến trình chạy trên PHP gốc và không cần thêm tiện ích mở rộng / mô-đun Apache / tập lệnh perl / những thứ khác để hoạt động.
Pekka

1
Vâng, đó là năm 2011 và bây giờ nó có thể thực hiện được nhờ HTML5. Xem phản hồi đầu tiên tại đây: stackoverflow.com/questions/76976/…
Zarel

10
Chà, đó là năm 2012 và tải tệp lên bằng HTML5 thông qua XMLHttpRequest vẫn không khả dụng trong tất cả các trình duyệt chính.
Damien B

3
@Pekka 웃 Không đúng. Nếu bạn đã cài đặt APC (và bạn nên làm như vậy), bạn có thể thực hiện nó hoàn toàn tự nhiên bằng PHP và không cần javascript.
Ariel

2
@Pekka 웃 Chưa kể đến việc tải lên sử dụng thông tin phiên trong PHP> = 5.4.
Wookie88

8

Một cách PHP-ish (5.2+) & không có Flash hoạt động hiệu quả đối với tôi:

Trước tiên, hãy xem bài đăng này giải thích cách thiết lập và chạy tiện ích mở rộng "uploadprogress".

Sau đó, trong trang có chứa biểu mẫu mà bạn đang tải (các) tệp lên, hãy tạo iframe sau:

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

Tiếp theo, thêm mã này vào nút "Gửi" của bạn:

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

Bây giờ bạn có một iframe ẩn trong biểu mẫu của bạn sẽ hiển thị và hiển thị nội dung của uploadprogress.php khi bạn nhấp vào "Gửi" để bắt đầu tải tệp lên. $ upload_id phải giống với giá trị mà bạn đang sử dụng làm giá trị của trường ẩn "UPLOAD_IDENTIFIER" trong biểu mẫu của bạn.

Bản thân tệp uploadprogress.php trông như thế này (sửa và điều chỉnh theo nhu cầu của bạn):

<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>

Lưu ý rằng tự làm mới mỗi giây. Bạn chắc chắn có thể thêm một số thanh tiến trình trực quan ở đây (như 2 <div> lồng nhau với các màu khác nhau) nếu bạn muốn. Iframe có tiến trình tải lên đương nhiên chỉ hoạt động trong khi quá trình tải lên đang diễn ra và kết thúc vòng đời hiển thị của nó khi biểu mẫu được gửi và trình duyệt tải lại trang tiếp theo.


Làm cách nào để bạn có thể tải tệp lên mà không có $ _FILES trong php

4

Việc triển khai thanh tiến trình tải lên rất dễ dàng và không yêu cầu bất kỳ phần mở rộng PHP, JavaScript hoặc Flash bổ sung nào. Nhưng bạn cần PHP 5.4 và mới hơn .

Bạn phải kích hoạt việc thu thập các thông tin tiến bộ tải lên bằng cách thiết lập các chỉ thị session.upload_progress.enabledđể Onphp.ini.

Sau đó, thêm đầu vào ẩn vào biểu mẫu tải lên HTML ngay trước bất kỳ đầu vào tệp nào khác. Thuộc tính HTML namecủa đầu vào ẩn đó phải giống với giá trị của chỉ thị session.upload_progress.nametừ php.ini(cuối cùng đứng trước session.upload_progress.prefix). Các valuethuộc tính là tùy thuộc vào bạn, nó sẽ được sử dụng như một phần của khóa phiên.

Biểu mẫu HTML có thể trông như thế này:

<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>

Khi bạn gửi biểu mẫu này, PHP sẽ tạo một khóa mới trong $_SESSIONcấu trúc superglobal sẽ được điền thông tin trạng thái tải lên. Khóa được nối namevaluecủa đầu vào ẩn.

Trong PHP, bạn có thể xem thông tin tải lên được phổ biến:

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

Đầu ra sẽ trông tương tự như sau:

$_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
    )
  )
);

Có tất cả thông tin cần thiết để tạo thanh tiến trình - bạn có thông tin nếu quá trình tải lên vẫn đang diễn ra, thông tin tổng cộng bao nhiêu byte sẽ được chuyển và bao nhiêu byte đã được chuyển.

Để trình bày tiến trình tải lên cho người dùng, hãy viết một tập lệnh PHP khác với tập lệnh tải lên, tập lệnh này sẽ chỉ xem xét thông tin tải lên trong phiên và trả lại ở định dạng JSON, chẳng hạn. Tập lệnh này có thể được gọi định kỳ, chẳng hạn như mỗi giây, sử dụng AJAX và thông tin được trình bày cho người dùng.

Bạn thậm chí có thể hủy tải lên bằng cách đặt $_SESSION[$key]['cancel_upload']thành true.

Để biết thông tin chi tiết, cài đặt bổ sung và nhận xét của người dùng, hãy xem hướng dẫn sử dụng PHP .


2

Một trình tải lên đầy đủ khác JS: http://developers.sirika.com/mfu/

  • Nó miễn phí (giấy phép BSD)
  • Có thể quốc tế hóa
  • tuân thủ nhiều trình duyệt
  • bạn có quyền lựa chọn cài đặt APC hay không (thanh tiến trình không xác định VS thanh tiến trình xác định)
  • Giao diện có thể tùy chỉnh vì nó sử dụng cơ chế mẫu dojo. Bạn có thể thêm lớp / id của mình trong các mẫu te tùy theo css của bạn

chúc vui vẻ


2

HTML5 đã giới thiệu một api tải lên tệp cho phép bạn theo dõi tiến trình tải tệp lên nhưng đối với các trình duyệt cũ hơn, plupload có một khuôn khổ được tạo riêng để theo dõi quá trình tải tệp lên và cung cấp thông tin về chúng. cộng với nó có nhiều lệnh gọi lại để có thể hoạt động trên tất cả các trình duyệt


2

Gears và HTML5 có một sự kiện tiến trình trong HttpRequestđối tượng để gửi tệp tải lên qua AJAX.

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

Các tùy chọn khác của bạn như đã được những người khác trả lời là:

  1. Trình tải lên dựa trên Flash.
  2. Trình tải lên dựa trên Java.
  3. Một yêu cầu kiểu sao chổi thứ hai tới máy chủ web hoặc một tập lệnh để báo cáo kích thước dữ liệu nhận được. Một số máy chủ web như Lighttpd cung cấp các mô-đun để thực hiện việc này trong quá trình để tiết kiệm chi phí gọi một tập lệnh hoặc quy trình bên ngoài.

Về mặt kỹ thuật, có một tùy chọn thứ tư, tương tự như tải lên YouTube, với Gears hoặc HTML5, bạn có thể sử dụng các đốm màu để chia tệp thành các phần nhỏ và tải lên riêng từng phần. Khi hoàn thành từng đoạn, bạn có thể cập nhật trạng thái tiến trình.


1

Bạn sẽ cần sử dụng Javascript để tạo thanh tiến trình. Một tìm kiếm đơn giản trên Google đã dẫn tôi đến bài viết này: Thanh tiến trình Javascript đơn giản của WebAppers với CSS .

Tiện ích thanh tiến trình tải lên tệp Dojo là một tùy chọn khác sử dụng khung Javascript của Dojo.

CHỈNH SỬA: Giả sử bạn tải lên một số lượng lớn hình ảnh (chẳng hạn như album ảnh) và ĐĂNG chúng lên tập lệnh PHP của bạn, bạn có thể sử dụng javascript để đọc kết quả từ bài đăng và cập nhật thanh tiến trình dựa trên số lượng hình ảnh được tải lên / tổng số hình ảnh. Điều này có tác dụng phụ là chỉ cập nhật sau khi mỗi bài đăng đã hoàn thành. Kiểm tra tại đây để biết một số thông tin về cách đăng bài với JS.


6
-1 Thanh tiến trình Javascript rất đẹp nhưng không liên quan gì đến việc tải tệp lên theo như tôi thấy. Và thanh tiến trình tải lên Dojo không cung cấp bất kỳ giao diện nào cho PHP. Tất nhiên, hãy sửa cho tôi nếu tôi sai.
Pekka

1

Một thanh tiến trình php / ajax có thể được thực hiện. (Kiểm tra thư viện Html_Ajax trong lê). Tuy nhiên, điều này yêu cầu cài đặt một mô-đun tùy chỉnh vào php.

Các phương pháp khác yêu cầu sử dụng iframe, qua đó php sẽ xem có bao nhiêu tệp đã được tải lên. Tuy nhiên iframe ẩn này có thể bị chặn bởi một số addon của trình duyệt vì iframe ẩn thường được sử dụng để gửi dữ liệu độc hại đến máy tính của người dùng.

Đặt cược tốt nhất của bạn là sử dụng một số dạng thanh tiến trình flash nếu bạn không có quyền kiểm soát máy chủ của mình.


Một số tiện ích bổ sung có thể chặn iframe, nhưng trình duyệt? Bạn có thể đưa ra một ví dụ không?
ya23

Googling điều khoản "tải lên tệp ajax php" trả về 4 trong số 5 kết quả hàng đầu, tất cả đều sử dụng iframe (không chắc liệu kết quả thứ 5 có (trang sẽ không tải)). Hãy xem các ví dụ trên mỗi trang web.
Ali Lown,

Thật vậy, họ sử dụng iframe, nhưng không đề cập đến việc nó có thể bị chặn trong mọi trường hợp. Hay tôi đã bỏ lỡ điều đó?
ya23

Xin lỗi, đọc nhầm những gì bạn đang cố hỏi, không, tôi không thể đưa ra bất kỳ ví dụ nào về các trình duyệt chặn trực tiếp iframe, tôi đã nghĩ đến các addon mà mọi người sử dụng với chúng, chẳng hạn như noscript chặn iframe. Cập nhật văn bản trong bài để tham khảo trong tương lai.
Ali Lown
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.