{"id":289,"date":"2013-09-22T11:10:25","date_gmt":"2013-09-22T10:10:25","guid":{"rendered":"http:\/\/zsteva.info\/?p=289"},"modified":"2013-09-22T11:10:25","modified_gmt":"2013-09-22T10:10:25","slug":"upload-velikih-fajlova-preko-phpa","status":"publish","type":"post","link":"http:\/\/zsteva.info\/blog\/2013\/09\/upload-velikih-fajlova-preko-phpa\/","title":{"rendered":"Upload velikih fajlova preko PHPa"},"content":{"rendered":"<p>Upload fajlove u PHP je generlno uradjen na potpuno pogre\u0161an nacin. Pretpostavka da ceo POST mora da stane u memoriju je sumanut zahtev. <\/p>\n<p>Potencijalna reshenja zahtevaju promenu nacina na koji se fajl uploaduje, ili zamenu PHPa sa PERLom (npr) na server strani samo za procesiranje uploada.<\/p>\n<p>Pre jedno godinu dana sam video zanimljiv nacin za komunikaciju embeded uredjaja sa web serverom. Ukratko: celo telo zahteva zavrshi u PHPu putem php:\/\/stdin handlera. I sad ostaje samo dilema kako to iskoristiti da browser misli da radi klasican upload (ecntype=&#8221;multipart\/form-data&#8221;), a da PHP php ne iskoristi svoj interni mehanizam za pakovanje celog zahteva u memoriju i parserovanje. I reshenje postoji, upotrebom dva standardna Apache modula modifikujemo content-type requesta tako da ne bude multipart\/form-data shto ujedno znaci da PHP nece parserovati. I to se moze raditi:<\/p>\n<pre>\r\nSetEnvIf content-type (multipart\/form-data)(.*) NEW_CONTENT_TYPE=multipart\/form-data-alternate$2 OLD_CONTENT_TYPE=$1$2\r\nRequestHeader set content-type %{NEW_CONTENT_TYPE}e env=NEW_CONTENT_TYPE\r\n<\/pre>\n<p>Potom sve shto je potrebno, je PHP kod koji parserije multipart\/form-data interno i bez smeshtanja u memoriju.<\/p>\n<p>Provereno sa nekoliko browsera, potrebno je jo\u0161 testiranja, ali re\u0161enje je vishe nego lako primenjivo i ne zahteva nikakvo modifikovanje ni browser koda, ni PHP scripte za upload. A to je omogu\u0107eno preloadom .php fajla.<\/p>\n<pre>\r\nphp_value auto_prepend_file php-uploader.inc.php\r\n<\/pre>\n<p>Jedina modifikacija PHP parametra je potreba da vreme izvrsavanja scripte bude dovoljno veliko da bi klient sa sporom konekcijom mogao da uradi kompletan upload.<\/p>\n<p>Source kod kompletnog reshenja: <a href=\"https:\/\/github.com\/zsteva\/php-uploader\">https:\/\/github.com\/zsteva\/php-uploader<\/a>.<\/p>\n<p>I kod mene na serveru test lokacija <a href=\"http:\/\/zsteva.info\/upload\/\">http:\/\/zsteva.info\/upload<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Upload fajlove u PHP je generlno uradjen na potpuno pogre\u0161an nacin. Pretpostavka da ceo POST mora da stane u memoriju je sumanut zahtev. Potencijalna reshenja zahtevaju promenu nacina na koji se fajl uploaduje, ili zamenu PHPa sa PERLom (npr) na &hellip; <a href=\"http:\/\/zsteva.info\/blog\/2013\/09\/upload-velikih-fajlova-preko-phpa\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[136,6,137],"tags":[],"_links":{"self":[{"href":"http:\/\/zsteva.info\/blog\/wp-json\/wp\/v2\/posts\/289"}],"collection":[{"href":"http:\/\/zsteva.info\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/zsteva.info\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/zsteva.info\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/zsteva.info\/blog\/wp-json\/wp\/v2\/comments?post=289"}],"version-history":[{"count":2,"href":"http:\/\/zsteva.info\/blog\/wp-json\/wp\/v2\/posts\/289\/revisions"}],"predecessor-version":[{"id":291,"href":"http:\/\/zsteva.info\/blog\/wp-json\/wp\/v2\/posts\/289\/revisions\/291"}],"wp:attachment":[{"href":"http:\/\/zsteva.info\/blog\/wp-json\/wp\/v2\/media?parent=289"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/zsteva.info\/blog\/wp-json\/wp\/v2\/categories?post=289"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/zsteva.info\/blog\/wp-json\/wp\/v2\/tags?post=289"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}