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ó 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:
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.
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 .
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.
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.
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
để On
ở php.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 name
của đầu vào ẩn đó phải giống với giá trị của chỉ thị session.upload_progress.name
từ php.ini
(cuối cùng đứng trước session.upload_progress.prefix
). Các value
thuộ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 $_SESSION
cấu trúc superglobal sẽ được điền thông tin trạng thái tải lên. Khóa được nối name
và value
củ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 .
Một trình tải lên đầy đủ khác JS: http://developers.sirika.com/mfu/
chúc vui vẻ
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
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à:
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.
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.
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.