ตรวจสอบว่าคนที่โหลดโหลดเสร็จหรือว่าโหลดแล้วล้มเหลวหรือยกเลิก
ผมก็ได้ทำโปรเจ็คเว็บให้บริการ download แล้วมีอยู่โจทย์หนึ่งที่ทำให้ลำบากอยู่พอควรก็คือพอเสียตังค์แล้วก็ให้โหลดได้ครั้งเดียว
แล้วคำถามในใจก็เกิดขึ้นนั้นก็คือแล้วถ้าคนโหลดตอนนั้นมันเน็ตหลุดไฟดับจะทำไง งานเข้าสิครับ เสียตังค์แล้วดันโหลดได้ครั้งเดียวไฟดับ
เน็ตหลุดโหลได้ครึ่งทางแล้วจะทำไงละไม่มีหลักฐานสะด้วยว่าเราโหลดเสร็จหรือไม่เสร็จ ผมก็เลยไปค้นหาในเจ้าประจำนั้นก็คือคุณ
google ผมก็ไปเจอเว็บนี้มาโดนเลยครับผมให้เครดิสคุณ petersprc@gmail.com เป็นฝรั่งเด้อเราก็มาดู code กันเลยดีกว่าว่ามายาวละ
// Sample usage
function sendTest(){
$res = sendFile('010153GS05.mp3', 'application/octet-stream');
if ($res['status']) {
// succeeded
}else{
//failed
}
@saveDownloadStatus($res);
}
sendTest(); //ใช้งานฟังชั่น
function sendFile($path, $contentType = 'application/octet-stream'){
ignore_user_abort(true);
header('Content-Transfer-Encoding: binary');
header('Content-Disposition: attachment; filename="' .basename($path) . "\";");
header("Content-Type: $contentType");
$res = array(
'status' =>false,
'errors' =>array(),
'readfileStatus' =>null,
'aborted' =>false
);
$res['readfileStatus'] = readfile($path);
if ($res['readfileStatus'] === false) {
$res['errors'][] = 'readfile failed.';
$res['status'] = false;
}
if (connection_aborted()) {
$res['errors'][] = 'Connection aborted.';
$res['aborted'] = true;
$res['status'] = false;
}
return $res;
}
// Save the status of the download to some place
function saveDownloadStatus($res){
$ok = false;
$fh = fopen('download-status-' . $_SERVER['REMOTE_ADDR'] . '-' .date('Ymd_His').'.txt', 'w');
if ($fh) {
$ok = true;
if (!fwrite($fh, var_export($res, true))) {
$ok = false;
}
if (!fclose($fh)) {
$ok = false;
}
}
return $ok;
}
ผมจะไม่อธิบายอะไรนะให้เพื่อนๆ เข้ามาแกะเกากันเองเพื่อจะทำให้เกินความรู้อื่นๆ ตามมาถ้าโดยปกติแล้วใครที่เขียน jsp ก็จะมี ConnectionException รองรับอยู่แล้วแต่ php จะไม่มีเราก็จะใช้ฟังชั่น ignore_user_abort() และ connection_aborted()
มาช่วยครับผมให้เครดิสเว็บ http://bytes.com/topic/php/answers/551302-how-detect-if-file-download-completed-cancelled ผมก็ขอจบเพียงเท่านี้นะครับนานๆ มาเขียนทีหนึ่งงานเยอะมากช่วงนี้เหอะ
ให้สังเกตุ aborted นะถ้าโหลดสำเร็จจะเป็น false ถ้าโหลดไม่สำเร็จจะเป็น true
แล้วคำถามในใจก็เกิดขึ้นนั้นก็คือแล้วถ้าคนโหลดตอนนั้นมันเน็ตหลุดไฟดับจะทำไง งานเข้าสิครับ เสียตังค์แล้วดันโหลดได้ครั้งเดียวไฟดับ
เน็ตหลุดโหลได้ครึ่งทางแล้วจะทำไงละไม่มีหลักฐานสะด้วยว่าเราโหลดเสร็จหรือไม่เสร็จ ผมก็เลยไปค้นหาในเจ้าประจำนั้นก็คือคุณ
google ผมก็ไปเจอเว็บนี้มาโดนเลยครับผมให้เครดิสคุณ petersprc@gmail.com เป็นฝรั่งเด้อเราก็มาดู code กันเลยดีกว่าว่ามายาวละ
// Sample usage
function sendTest(){
$res = sendFile('010153GS05.mp3', 'application/octet-stream');
if ($res['status']) {
// succeeded
}else{
//failed
}
@saveDownloadStatus($res);
}
sendTest(); //ใช้งานฟังชั่น
function sendFile($path, $contentType = 'application/octet-stream'){
ignore_user_abort(true);
header('Content-Transfer-Encoding: binary');
header('Content-Disposition: attachment; filename="' .basename($path) . "\";");
header("Content-Type: $contentType");
$res = array(
'status' =>false,
'errors' =>array(),
'readfileStatus' =>null,
'aborted' =>false
);
$res['readfileStatus'] = readfile($path);
if ($res['readfileStatus'] === false) {
$res['errors'][] = 'readfile failed.';
$res['status'] = false;
}
if (connection_aborted()) {
$res['errors'][] = 'Connection aborted.';
$res['aborted'] = true;
$res['status'] = false;
}
return $res;
}
// Save the status of the download to some place
function saveDownloadStatus($res){
$ok = false;
$fh = fopen('download-status-' . $_SERVER['REMOTE_ADDR'] . '-' .date('Ymd_His').'.txt', 'w');
if ($fh) {
$ok = true;
if (!fwrite($fh, var_export($res, true))) {
$ok = false;
}
if (!fclose($fh)) {
$ok = false;
}
}
return $ok;
}
ผมจะไม่อธิบายอะไรนะให้เพื่อนๆ เข้ามาแกะเกากันเองเพื่อจะทำให้เกินความรู้อื่นๆ ตามมาถ้าโดยปกติแล้วใครที่เขียน jsp ก็จะมี ConnectionException รองรับอยู่แล้วแต่ php จะไม่มีเราก็จะใช้ฟังชั่น ignore_user_abort() และ connection_aborted()
มาช่วยครับผมให้เครดิสเว็บ http://bytes.com/topic/php/answers/551302-how-detect-if-file-download-completed-cancelled ผมก็ขอจบเพียงเท่านี้นะครับนานๆ มาเขียนทีหนึ่งงานเยอะมากช่วงนี้เหอะ
ให้สังเกตุ aborted นะถ้าโหลดสำเร็จจะเป็น false ถ้าโหลดไม่สำเร็จจะเป็น true