Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Remote upload w tle PHP+Jquery
Forum PHP.pl > Forum > PHP
Simonell
Witam,
Próbuje stworzyć menadżer pobierania na mój serwer NAS który śmigałby w PHP+Jquery, i mam jeden bardzo poważny problem.
Mianowicie chciałbym aby serwer pobierał podane pliki w podanych godzinach do wybranego katalogu, oraz pokazywał stan pobierania.
Znalazłem skrypt który umożliwia pobieranie pliku z pokazywaniem stanu, lecz gdy odświeżę stronę skrypt przestaje pobierać plik, chciałbym aby skrypt działał w tle nawet w trakcie wyłączenia strony.
Domyślam się że możliwe jest to używając nodejs którego nie znam, lecz chciałbym poszukać innego rozwiązania, i tutaj pojawia się pytanie, czy da się takie coś zrobić w jQuery i PHP?

Oto skrypt który znalazłem, o ile to coś pomoże:
  1. <?php
  2. /*
  3.  * Remote File Copy PHP Script 2.0.0
  4.  *
  5.  * Copyright 2012, Sebastian Tschan
  6.  * <a href="https://blueimp.net" target="_blank">https://blueimp.net</a>
  7.  *
  8.  * Licensed under the MIT license:
  9.  * <a href="http://www.opensource.org/licenses/MIT" target="_blank">http://www.opensource.org/licenses/MIT</a>
  10.  */
  11. $upload_dir = __DIR__."/downloads";
  12. if (empty($_REQUEST["url"])) {
  13. ?><!DOCTYPE HTML>
  14. <html lang="en">
  15. <head>
  16. <!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]-->
  17. <meta charset="utf-8">
  18. <title>Remote File Copy</title>
  19. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  20. </head>
  21. <body>
  22. <form>
  23. <input type="url" placeholder="URL" required>
  24. <button type="submit">Start</button>
  25. </form>
  26. <ul></ul>
  27. <progress value="0" max="100" style="display:none;"></progress>
  28. <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
  29. <script>
  30. function callback(message) {
  31. if (!message) {
  32. console.error('Empty event callback response.');
  33. return;
  34. }
  35. $.each(message, function (key, value) {
  36. switch (key) {
  37. case 'send':
  38. $('progress').show();
  39. break;
  40. case 'progress':
  41. if (value && value.total) {
  42. $('progress').val(value.loaded / value.total * 100);
  43. }
  44. break;
  45. case 'done':
  46. $('<li style="color:green;">').text(value && value.name).appendTo('ul');
  47. $('progress').hide();
  48. break;
  49. case 'fail':
  50. $('<li style="color:red;">').text(value && value.message).appendTo('ul');
  51. $('progress').hide();
  52. break;
  53. }
  54. });
  55. }
  56. $('form').on('submit', function (e) {
  57. e.preventDefault();
  58. $('<iframe src="java script:false;" style="display:none;"></iframe>')
  59. .prop('src', '?url=' + encodeURIComponent($(this).find('input').val()))
  60. .appendTo(document.body);
  61. });
  62. </script>
  63. </body>
  64. </html><?php
  65. }
  66. $url = !empty($_REQUEST["url"]) && preg_match("|^http(s)?://.+$|", stripslashes($_REQUEST["url"])) ?
  67. stripslashes($_REQUEST["url"]) : null;
  68. $callback = !empty($_REQUEST["callback"]) && preg_match("|^\w+$|", $_REQUEST["callback"]) ?
  69. $_REQUEST["callback"] : "callback";
  70. $use_curl = defined("CURLOPT_PROGRESSFUNCTION");
  71. $temp_file = tempnam(sys_get_temp_dir(), "upload-");
  72. $fileinfo = new stdClass();
  73. $fileinfo->name = trim(basename($url), ".\x00..\x20");
  74. // 1KB of initial data, required by Webkit browsers:
  75. echo "<span>".str_repeat("0", 1000)."</span>";
  76. function event_callback ($message) {
  77. global $callback;
  78. echo "<script>parent.".$callback."(".json_encode($message).");</script>";
  79. }
  80. function get_file_path () {
  81. global $upload_dir, $fileinfo, $temp_file;
  82. return $upload_dir."/".basename($fileinfo->name).'.'.basename($temp_file).'.dat';
  83. }
  84. function stream_notification_callback ($notification_code, $severity, $message, $message_code, $bytes_transferred, $bytes_max) {
  85. global $fileinfo;
  86. switch($notification_code) {
  87. case STREAM_NOTIFY_FILE_SIZE_IS:
  88. $fileinfo->size = $bytes_max;
  89. break;
  90. case STREAM_NOTIFY_MIME_TYPE_IS:
  91. $fileinfo->type = $message;
  92. break;
  93. case STREAM_NOTIFY_PROGRESS:
  94. if (!$bytes_transferred) {
  95. event_callback(array("send" => $fileinfo));
  96. }
  97. event_callback(array("progress" => array("loaded" => $bytes_transferred, "total" => $bytes_max)));
  98. break;
  99. }
  100. }
  101. function curl_progress_callback ($curl_resource, $total, $loaded) {
  102. global $fileinfo;
  103. if (!$loaded) {
  104. if (!isset($fileinfo->size)) {
  105. $fileinfo->size = $total;
  106. event_callback(array("send" => $fileinfo));
  107. }
  108. }
  109. event_callback(array("progress" => array("loaded" => $loaded, "total" => $total)));
  110. }
  111. if (!$url) {
  112. $success = false;
  113. } else if ($use_curl) {
  114. $fp = fopen($temp_file, "w");
  115. $ch = curl_init($url);
  116. curl_setopt($ch, CURLOPT_NOPROGRESS, false );
  117. curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, "curl_progress_callback");
  118. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
  119. curl_setopt($ch, CURLOPT_FILE, $fp);
  120. $success = curl_exec($ch);
  121. $curl_info = curl_getinfo($ch);
  122. if (!$success) {
  123. $err = array("message" => curl_error($ch));
  124. }
  125. curl_close($ch);
  126. fclose($fp);
  127. $fileinfo->size = $curl_info["size_download"];
  128. $fileinfo->type = $curl_info["content_type"];
  129. } else {
  130. stream_context_set_params($ctx, array("notification" => "stream_notification_callback"));
  131. $success = copy($url, $temp_file, $ctx);
  132. if (!$success) {
  133. $err = error_get_last();
  134. }
  135. }
  136. if ($success) {
  137. $success = rename($temp_file, get_file_path());
  138. }
  139. if ($success) {
  140. event_callback(array("done" => $fileinfo));
  141. } else {
  142. unlink($temp_file);
  143. if (!$err) {
  144. $err = array("message" => "Invalid url parameter");
  145. }
  146. event_callback(array("fail" => $err));
  147. }?>
prz3kus
jquery działa po stronie przeglądarki wiec odpada.

Proponuje PHP + CRON i zapisać wyniki do bazy danych
Simonell
Myślałem, żeby php wykorzystać do pobierania, ale niewiem jak zrobić aby działało to w tle, jquery chciałbym wykorzystać tylko do wyświetlania progressbara na bieżąco.
Cron również będzie potrzebny, do uruchamiania o danych godzinach, lecz myślę jak konfigurować go z poziomu php.
Kombinowałem również z "exec()", i wgetem użytym ze sedem, zapisując wynik do pliku textowego, lecz nie udało mi się tego sensownie poskładać.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.