Форумы портала PHP.SU » » Работа с файловой системой и файлами » Загрузка двух файлов большого и малого размеров

Страниц (1): [1]
 

1. leshiy - 07 Декабря, 2016 - 15:53:18 - перейти к сообщению
Мне нужен был загрузчик файлов больших размеров на сервер и покопавшись в инете я нашел такой но он загружает на сервер только один файл а мне нужно загрузить один большой файл и один маленький и в разные директории.
Вот коды:
index.php
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $hash=htmlspecialchars(stripslashes($_GET["hash"]));
  3. $hash=md5("test");
  4. ?>
  5. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  6. <html><head>
  7. <meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
  8.  
  9. <style type="text/css">
  10. #cnuploader_progressbar {display:none;margin-top:10px;height:16px;font-family:sans-serif;font-size:12px;padding:3px;width:300px;position:absolute;text-align:center;color:black;border:1px solid black;display:hidden;}
  11. #cnuploader_progresscomplete {display:none;margin-top:10px;height:16px;font-family:sans-serif;font-size:12px;padding:3px;width:0;text-align:center;background-color:blue;color:white;border:1px solid transparent;display:hidden;}
  12. </style>
  13.  
  14. <script type="text/javascript" src="./fileuploader.js?nc=<?PHP print time();?>"></script>
  15.  
  16. </head>
  17. <body onload="ShowForm();">
  18. <div class="content">
  19.  
  20. <p>Максимальный размер файла при загрузке через браузер - <b>4Гб</b>.</p>
  21.  
  22. <form action="./" method="post" id="uploadform" onsubmit="return false;" style="display:none;">
  23.  
  24.     <table class="colortable" cellspacing=1>
  25.                 <tr><td><div id="message">Выберите файл:</div></td><td><input type="file" id="files" name="files[]" /></td></t>
  26. <input type="file" id="jpg" name="jpg" /></td></t>             
  27.         </table>
  28.     <input type="submit" value="Загрузить >>" />
  29.  
  30. </form>
  31.  
  32. <div id="cnuploader_progressbar"></div>
  33. <div id="cnuploader_progresscomplete"></div>
  34. <p class="hint">Используется загрузчик HTML5</p>
  35. </div>
  36.  
  37. <script type="text/javascript">
  38.  
  39. function ShowForm() {
  40.  
  41.         var uploader=new FileUploader( {
  42.                 message_error: 'Ошибка при загрузке файла',
  43.                 form: 'uploadform',
  44.                 formfiles: 'files',
  45.                 uploadid: '<?PHP print $hash;?>',
  46.                 uploadscript: './upload.php',
  47.                 redirect_success: './step2.php?hash=<?PHP print $hash;?>',
  48.                 redirect_abort: './abort.php?hash=<?PHP print $hash;?>',
  49.                 portion: 1024*1024*2
  50.                 });
  51.  
  52.         if (!uploader) document.location='/upload/iframe.php?hash=<?PHP print $hash;?>';
  53.         else {
  54.                 if (!uploader.CheckBrowser()) document.location='/upload/iframe.php?hash=<?PHP print $hash;?>';
  55.                 else {
  56.                         var e=document.getElementById('uploadform');
  57.                         if (e) e.style.display='block';
  58.  
  59.                         }
  60.                 }
  61.         }
  62. </script>
  63. </body>
  64. </html>
  65.  

upload.php
PHP:
скопировать код в буфер обмена
  1.  
  2. // Каталог в который будет загружаться файл
  3. $uploaddir="./uploaddir";
  4.  
  5. // Идентификатор загрузки (аплоада). Для генерации идентификатора я обычно использую функцию md5()
  6. $hash=$_SERVER["HTTP_UPLOAD_ID"];
  7.  
  8. // Информацию о ходе загрузки сохраним в системный лог, это позволить решать проблемы оперативнее
  9. openlog("html5upload.php", LOG_PID | LOG_PERROR, LOG_LOCAL0);
  10.  
  11. // Проверим корректность идентификатора
  12. if (preg_match("/^[0123456789abcdef]{32}$/i",$hash)) {
  13.  
  14.  
  15.     // Если HTTP запрос сделан методом GET, то это не загрузка порции, а пост-обработка
  16.     if ($_SERVER["REQUEST_METHOD"]=="GET") {
  17.        
  18.         // abort - сотрем загружаемый файл. Загрузка не удалась.
  19.         if ($_GET["action"]=="abort") {
  20.             if (is_file($uploaddir."/".$hash.".html5upload")) unlink($uploaddir."/".$hash.".html5upload");
  21.             print "ok abort";
  22.             return;
  23.             }
  24.  
  25.         // done - загрузка завершена успешно. Переименуем файл и создадим файл-флаг.
  26.         if ($_GET["action"]=="done") {
  27.             syslog(LOG_INFO, "Finished for hash ".$hash);
  28.  
  29.             // Если файл существует, то удалим его
  30.             if (is_file($uploaddir."/".$hash.".original")) unlink($uploaddir."/".$hash.".original");
  31.  
  32.             // Переименуем загружаемый файл
  33.             rename($uploaddir."/".$hash.".html5upload",$uploaddir."/".$hash.".original");
  34.  
  35.             // Создадим файл-флаг
  36.             $fw=fopen($uploaddir."/".$hash.".original_ready","wb");if ($fw) fclose($fw);
  37.             }
  38.         }
  39.    
  40.     // Если HTTP запрос сделан методом POST, то это загрузка порции
  41.     elseif ($_SERVER["REQUEST_METHOD"]=="POST") {
  42.  
  43.         syslog(LOG_INFO, "Uploading chunk. Hash ".$hash." (".intval($_SERVER["HTTP_PORTION_FROM"])."-".intval($_SERVER["HTTP_PORTION_FROM"]+$_SERVER["HTTP_PORTION_SIZE"]).", size: ".intval($_SERVER["HTTP_PORTION_SIZE"]).")");
  44.  
  45.         // Имя файла получим из идентификатора загрузки
  46.         $filename=$uploaddir."/".$hash.".html5upload";
  47.  
  48.         // Если загружается первая порция, то откроем файл для записи, если не первая, то для дозаписи.
  49.         if (intval($_SERVER["HTTP_PORTION_FROM"])==0)
  50.             $fout=fopen($filename,"wb");
  51.         else
  52.             $fout=fopen($filename,"ab");
  53.  
  54.         // Если не смогли открыть файл на запись, то выдаем сообщение об ошибке
  55.         if (!$fout) {
  56.             syslog(LOG_INFO, "Can't open file for writing: ".$filename);
  57.             header("HTTP/1.0 500 Internal Server Error");
  58.             print "Can't open file for writing.";
  59.             return;
  60.             }
  61.  
  62.         // Из stdin читаем данные отправленные методом POST - это и есть содержимое порций
  63.         $fin = fopen("php://input", "rb");
  64.         if ($fin) {
  65.             while (!feof($fin)) {
  66.                 // Считаем 1Мб из stdin
  67.                 $data=fread($fin, 1024*1024);
  68.                 // Сохраним считанные данные в файл
  69.                 fwrite($fout,$data);
  70.                 }
  71.             fclose($fin);
  72.             }
  73.  
  74.         fclose($fout);
  75.         }
  76.  
  77.     // Все нормально, вернем HTTP 200 и тело ответа "ok"
  78.     header("HTTP/1.0 200 OK");
  79.     print "ok\n";
  80.     }
  81. else {
  82.     // Если неверный идентификатор загрузку, то вернем HTTP 500 и сообщение об ошибке
  83.     syslog(LOG_INFO, "Uploading chunk. Wrong hash ".$hash);
  84.     header("HTTP/1.0 500 Internal Server Error");
  85.     print "Wrong session hash.";
  86.     }
  87.  
  88. // Закроем syslog лог
  89.  

(Добавление)
CODE (javascript):
скопировать код в буфер обмена
  1.  
  2.  
  3. // Для начала определим метод XMLHttpRequest.sendAsBinary(),
  4. // если он не определен (Например, для браузера Google Chrome).
  5.  
  6. if (!XMLHttpRequest.prototype.sendAsBinary) {
  7.  
  8.     XMLHttpRequest.prototype.sendAsBinary = function(datastr) {
  9.         function byteValue(x) {
  10.             return x.charCodeAt(0) & 0xff;
  11.             }
  12.         var ords = Array.prototype.map.call(datastr, byteValue);
  13.         var ui8a = new Uint8Array(ords);
  14.         this.send(ui8a.buffer);
  15.         }
  16.     }
  17.  
  18. /**
  19.  * Класс FileUploader.
  20.  * @param ioptions Ассоциативный массив опций загрузки
  21.  */
  22. function FileUploader(ioptions) {
  23.  
  24.     // Позиция, с которой будем загружать файл
  25.     this.position=0;
  26.  
  27.     // Размер загружаемого файла
  28.     this.filesize=0;
  29.  
  30.     // Объект Blob или File (FileList[i])
  31.     this.file = null;
  32.  
  33.     // Ассоциативный массив опций
  34.     this.options=ioptions;
  35.  
  36.     // Если не определена опция uploadscript, то возвращаем null. Нельзя
  37.     // продолжать, если эта опция не определена.
  38.     if (this.options['uploadscript']==undefined) return null;
  39.  
  40.     /*
  41.     * Проверка, поддерживает ли браузер необходимые объекты
  42.     * @return true, если браузер поддерживает все необходимые объекты
  43.     */
  44.     this.CheckBrowser=function() {
  45.         if (window.File && window.FileReader && window.FileList && window.Blob) return true; else return false;
  46.         }
  47.  
  48.  
  49.     /*
  50.     * Загрузка части файла на сервер
  51.     * @param from Позиция, с которой будем загружать файл
  52.     */
  53.     this.UploadPortion=function(from) {
  54.  
  55.         // Объект FileReader, в него будем считывать часть загружаемого файла
  56.         var reader = new FileReader();
  57.  
  58.         // Текущий объект
  59.         var that=this;
  60.  
  61.         // Позиция с которой будем загружать файл
  62.         var loadfrom=from;
  63.  
  64.         // Объект Blob, для частичного считывания файла
  65.         var blob=null;
  66.  
  67.         // Таймаут для функции setTimeout. С помощью этой функции реализована повторная попытка загрузки
  68.         // по таймауту (что не совсем корректно)
  69.         var xhrHttpTimeout=null;
  70.  
  71.         /*
  72.         * Событие срабатывающее после чтения части файла в FileReader
  73.         * @param evt Событие
  74.         */
  75.         reader.onloadend = function(evt) {
  76.             if (evt.target.readyState == FileReader.DONE) {
  77.  
  78.                 // Создадим объект XMLHttpRequest, установим адрес скрипта для POST
  79.                 // и необходимые заголовки HTTP запроса.
  80.                 var xhr = new XMLHttpRequest();
  81.                 xhr.open('POST', that.options['uploadscript'], true);
  82.                 xhr.setRequestHeader("Content-Type", "application/x-binary; charset=x-user-defined");
  83.  
  84.                 // Идентификатор загрузки (чтобы знать на стороне сервера что с чем склеивать)
  85.                 xhr.setRequestHeader("Upload-Id", that.options['uploadid']);
  86.                 // Позиция начала в файле
  87.                 xhr.setRequestHeader("Portion-From", from);
  88.                 // Размер порции
  89.                 xhr.setRequestHeader("Portion-Size", that.options['portion']);
  90.  
  91.                 // Установим таймаут
  92.                 that.xhrHttpTimeout=setTimeout(function() {
  93.                     xhr.abort();
  94.                     },that.options['timeout']);
  95.  
  96.                 /*
  97.                 * Событие XMLHttpRequest.onProcess. Отрисовка ProgressBar.
  98.                 * @param evt Событие
  99.                 */
  100.                 xhr.upload.addEventListener("progress", function(evt) {
  101.                     if (evt.lengthComputable) {
  102.  
  103.                         // Посчитаем количество закаченного в процентах (с точность до 0.1)
  104.                         var percentComplete = Math.round((loadfrom+evt.loaded) * 1000 / that.filesize);percentComplete/=10;
  105.            
  106.                         // Посчитаем ширину синей полоски ProgressBar
  107.                         var width=Math.round((loadfrom+evt.loaded) * 300 / that.filesize);
  108.  
  109.                         // Изменим свойства элементом ProgressBar'а, добавим к нему текст
  110.                         var div1=document.getElementById('cnuploader_progressbar');
  111.                         var div2=document.getElementById('cnuploader_progresscomplete');
  112.  
  113.                         div1.style.display='block';
  114.                         div2.style.display='block';
  115.                         div2.style.width=width+'px';
  116.                         if (percentComplete<30) {
  117.                             div2.textContent='';
  118.                             div1.textContent=percentComplete+'%';
  119.                             }
  120.                         else {
  121.                             div2.textContent=percentComplete+'%';
  122.                             div1.textContent='';
  123.                             }
  124.                         }
  125.                    
  126.                     }, false);
  127.  
  128.  
  129.  
  130.                 /*
  131.                 * Событие XMLHttpRequest.onLoad. Окончание загрузки порции.
  132.                 * @param evt Событие
  133.                 */
  134.                 xhr.addEventListener("load", function(evt) {
  135.  
  136.                     // Очистим таймаут
  137.                     clearTimeout(that.xhrHttpTimeout);
  138.  
  139.                     // Если сервер не вернул HTTP статус 200, то выведем окно с сообщением сервера.
  140.                     if (evt.target.status!=200) {
  141.                         alert(evt.target.responseText);
  142.                         return;
  143.                         }
  144.  
  145.                     // Добавим к текущей позиции размер порции.
  146.                     that.position+=that.options['portion'];
  147.  
  148.                     // Закачаем следующую порцию, если файл еще не кончился.
  149.                     if (that.filesize>that.position) {
  150.                         that.UploadPortion(that.position);
  151.                         }
  152.                     else {
  153.                         // Если все порции загружены, сообщим об этом серверу. XMLHttpRequest, метод GET,
  154.                         // PHP скрипт тот-же.
  155.                         var gxhr = new XMLHttpRequest();
  156.                         gxhr.open('GET', that.options['uploadscript']+'?action=done', true);
  157.  
  158.                         // Установим идентификатор загруки.
  159.                         gxhr.setRequestHeader("Upload-Id", that.options['uploadid']);
  160.  
  161.                         /*
  162.                         * Событие XMLHttpRequest.onLoad. Окончание загрузки сообщения об окончании загрузки файла :).
  163.                         * @param evt Событие
  164.                         */
  165.                         gxhr.addEventListener("load", function(evt) {
  166.  
  167.                             // Если сервер не вернул HTTP статус 200, то выведем окно с сообщением сервера.
  168.                             if (evt.target.status!=200) {
  169.                                 alert(evt.target.responseText.toString());
  170.                                 return;
  171.                                 }
  172.                             // Если все нормально, то отправим пользователя дальше. Там может быть сообщение
  173.                             // об успешной загрузке или следующий шаг формы с дополнительным полями.
  174.                             else window.parent.location=that.options['redirect_success'];
  175.                             }, false);
  176.  
  177.                         // Отправим HTTP GET запрос
  178.                         gxhr.sendAsBinary('');
  179.                         }
  180.                     }, false);
  181.  
  182.                 /*
  183.                 * Событие XMLHttpRequest.onError. Ошибка при загрузке
  184.                 * @param evt Событие
  185.                 */
  186.                 xhr.addEventListener("error", function(evt) {
  187.  
  188.                     // Очистим таймаут
  189.                     clearTimeout(that.xhrHttpTimeout);
  190.  
  191.                     // Сообщим серверу об ошибке во время загруке, сервер сможет удалить уже загруженные части.
  192.                     // XMLHttpRequest, метод GET,  PHP скрипт тот-же.
  193.                     var gxhr = new XMLHttpRequest();
  194.  
  195.                     gxhr.open('GET', that.options['uploadscript']+'?action=abort', true);
  196.  
  197.                     // Установим идентификатор загруки.
  198.                     gxhr.setRequestHeader("Upload-Id", that.options['uploadid']);
  199.  
  200.                     /*
  201.                     * Событие XMLHttpRequest.onLoad. Окончание загрузки сообщения об ошибке загрузки :).
  202.                     * @param evt Событие
  203.                     */
  204.                     gxhr.addEventListener("load", function(evt) {
  205.  
  206.                         // Если сервер не вернул HTTP статус 200, то выведем окно с сообщением сервера.
  207.                         if (evt.target.status!=200) {
  208.                             alert(evt.target.responseText);
  209.                             return;
  210.                             }
  211.                         }, false);
  212.  
  213.                     // Отправим HTTP GET запрос
  214.                     gxhr.sendAsBinary('');
  215.  
  216.                     // Отобразим сообщение об ошибке
  217.                     if (that.options['message_error']==undefined) alert("There was an error attempting to upload the file."); else alert(that.options['message_error']);
  218.                     }, false);
  219.  
  220.                 /*
  221.                 * Событие XMLHttpRequest.onAbort. Если по какой-то причине передача прервана, повторим попытку.
  222.                 * @param evt Событие
  223.                 */
  224.                 xhr.addEventListener("abort", function(evt) {
  225.                     clearTimeout(that.xhrHttpTimeout);
  226.                     that.UploadPortion(that.position);
  227.                     }, false);
  228.  
  229.                 // Отправим порцию методом POST
  230.                 xhr.sendAsBinary(evt.target.result);
  231.                 }
  232.             };
  233.  
  234.         that.blob=null;
  235.  
  236.         // Считаем порцию в объект Blob. Три условия для трех возможных определений Blob.[.*]slice().
  237.         if (this.file.slice) that.blob=this.file.slice(from,from+that.options['portion']);
  238.         else {
  239.             if (this.file.webkitSlice) that.blob=this.file.webkitSlice(from,from+that.options['portion']);
  240.             else {
  241.                 if (this.file.mozSlice) that.blob=this.file.mozSlice(from,from+that.options['portion']);
  242.                 }
  243.             }
  244.  
  245.         // Считаем Blob (часть файла) в FileReader
  246.         reader.readAsBinaryString(that.blob);
  247.         }
  248.  
  249.  
  250.     /*
  251.     * Загрузка файла на сервер
  252.     * return Число. Если не 0, то произошла ошибка
  253.     */
  254.     this.Upload=function() {
  255.  
  256.         // Скроем форму, чтобы пользователь не отправил файл дважды
  257.         var e=document.getElementById(this.options['form']);
  258.         if (e) e.style.display='none';
  259.  
  260.         if (!this.file) return -1;
  261.         else {
  262.  
  263.             // Если размер файла больше размера порциии ограничимся одной порцией
  264.             if (this.filesize>this.options['portion']) this.UploadPortion(0,this.options['portion']);
  265.  
  266.             // Иначе отправим файл целиком
  267.             else this.UploadPortion(0,this.filesize);
  268.             }
  269.         }
  270.  
  271.  
  272.  
  273.     if (this.CheckBrowser()) {
  274.  
  275.         // Установим значения по умолчанию
  276.         if (this.options['portion']==undefined) this.options['portion']=1048576;
  277.         if (this.options['timeout']==undefined) this.options['timeout']=15000;
  278.  
  279.         var that = this;
  280.  
  281.         // Добавим обработку события выбора файла
  282.         document.getElementById(this.options['formfiles']).addEventListener('change', function (evt) {
  283.  
  284.             var files=evt.target.files;
  285.  
  286.             // Выберем только первый файл
  287.             for (var i = 0, f; f = files[i]; i++) {
  288.                 that.filesize=f.size;
  289.                 that.file = f;
  290.                 break;
  291.                 }
  292.             }, false);
  293.  
  294.         // Добавим обработку события onSubmit формы
  295.         document.getElementById(this.options['form']).addEventListener('submit', function (evt) {
  296.             that.Upload();
  297.             (arguments[0].preventDefault)? arguments[0].preventDefault(): arguments[0].returnValue = false;
  298.             }, false);
  299.         }
  300.  
  301.  
  302.     }
  303.  

 

Powered by ExBB FM 1.0 RC1