NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Upload obrázků/souborů -> složka tmp

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
katrincsak
Člen
Avatar
katrincsak:8.7.2015 10:43

Zdravím,

snažím se pomocí formuláře nahrát fotografie, ale z nějakého důvodu se mi nedaří vytvořit soubor v dané složce. Složky si vytvořím, ale problém je zřejmě v tom, že se soubor neuloží do dočasného úložiště na hostingu do "tmp". Jsem u Wedosu. Rád bych k tomu došel sám, ale netuším v jaké fázi se soubor uloží do tmp a jestli po refreshi stránky se vytratí?

Na víc po zpracování formuláře uložím $_FILES do $_SESSION .....(tmp, name a size).
Při volání:
move_uploaded_fi­le($soubor, $cesta."/".$sou­bor_name)

to nenajde tmp, který tam skutečně na FTP není :/ .. složka samozřejmě ano, ale nevytvoří se do ní ten soubor.

 
Odpovědět
8.7.2015 10:43
Avatar
katrincsak
Člen
Avatar
katrincsak:8.7.2015 11:26

Vytvořil jsem z toho nudli a funguje to. Za jak dlouho se smaže soubor ze složky tmp? Já jen že po nahrátí souboru tam stejně nic není a ani v době nahrávání jsem nic nedokázal zpozorovat.

 
Nahoru Odpovědět
8.7.2015 11:26
Avatar
katrincsak
Člen
Avatar
katrincsak:8.7.2015 11:41

Zase nějaký šašek co umí jen dávat mínusy? Tak hlavně že vím proč, předpokládám že to neví ani sám dotyčný a nebo se bojí že jeho odpověď by byla možná ještě větší blbost. Tak hodně štěstí :) ! Zřejmě nějaký kid.

 
Nahoru Odpovědět
8.7.2015 11:41
Avatar
Richard
Člen
Avatar
Odpovídá na katrincsak
Richard:8.7.2015 12:40

Zřejmě si ho dostal, protože neumíš položit otázku a potom dáváš otázky na který ti nikdo krom tebe odpovědět nedokáže.

Nahoru Odpovědět
8.7.2015 12:40
$action = $_GET['Life']; | Když dáš mínus, napiš proč!
Avatar
katrincsak
Člen
Avatar
katrincsak:8.7.2015 13:53

Pakliže to tak je, tak bez komentáře to nezjistím. Na víc si myslím že popis obsahuje vše co je třeba pro toho kdo ví o co se jedná. To že někdo otázce nerozumí neznamená hned, že je špatně položená :) A nevím co bych na popisu měl upravit, což bych klidně rád.

Možná by mi stačilo jen poradit, jak přesunu input typu "file" do dalšího formuláře.

  • Pakliže $_FILES uložím do proměnné, tak mám uložený jen řetězec, ale dočasný soubor již neexistuje.

Snažím se používat MVC Architekturu.
Mám 3 formuláře, ale stačí se bavit o 2 posledních.

(Jsou to jen pohledy pro malou představu)

1. (zadání inzerce)
http://pastebin.com/WSeFd7Mz

2. (údaje k editaci)
http://pastebin.com/5H5Nivf8

Poslední formulář tlačítkem "Dokončit" Vše nahraje tam kam má. Všechno včetně kontroly atp funguje perfektně. Jenže já potřebuji vložit obrázek ve formuláří "1. (zadání inzerce)" ale uložit fotografie až v Dokončení.

 
Nahoru Odpovědět
8.7.2015 13:53
Avatar
Odpovídá na katrincsak
Neaktivní uživatel:8.7.2015 14:03

Soubor v proměnné $_FILES je pouze pole, tudíž pokud si ho uložíš do COOKIES (popřípadě SESSION), můžeš proměnnou použít v dalších souborech.

Nahoru Odpovědět
8.7.2015 14:03
Neaktivní uživatelský účet
Avatar
katrincsak
Člen
Avatar
Odpovídá na Neaktivní uživatel
katrincsak:8.7.2015 14:17

Ano, do SESSION jsem to uložil, ale jakmile se snažím vyvolat movie_uploaded_fi­le() nebo copy() tak to již tmp_name nedokáže přesunout, protože neexistuje.

Po odeslání formuláře udělám toto:

$_SESSION['obrazky'] = $_FILES['obrazky'];

Pakliže z toho vytvořím pole, mohu to pak volat např. i takto:
$_SESSION['obraz­ky'] ['tmp_name']['0'] ...
$_SESSION['obraz­ky'] ['name']['0'] ...
$_SESSION['obraz­ky'] ['size']['0'] ..

Každopádně když si to vypíšu vše je v pohodě...tmp_name i name i size to vypíše, ale při zpracování to již nemůže v druhém formuláři najít soubor i když jméno znám.


Inspiroval jsem se:
http://tutorialy.vytvorweb.cz/…souboru.html

1. Po zpracování formmuláře udělám tedy toto:

$_SESSION['obrazky'] = $_FILES['obrazky'];

2. Teoreticky by mělo stačit dle uvedeného "návodu" upravit jenom

$soubor = ($_FILES["soubor"]["tmp_name"]);
$soubor_name = ($_FILES["soubor"]["name"]);
$soubor_size = ($_FILES["soubor"]["size"]/1024)/1024;

Na místo toho napsat už toto: (aktuálně vkládám jen 1 fotku)

$soubor = ($_SESSION["obrazky"]["tmp_name"]);
$soubor_name = ($_SESSION["obrazky"]["name"]);
$soubor_size = ($_SESSION["obrazky"]["size"]/1024)/1024;

Jenže $soubor ... neboli $_SESSION["obraz­ky"]["tmp_name"] již nemůže nalézt soubor s daným názvem.

 
Nahoru Odpovědět
8.7.2015 14:17
Avatar
Odpovídá na katrincsak
Neaktivní uživatel:8.7.2015 14:31

Nenašel jsem řešení, které by bylo nějak elegantní (ledaže bys celý formulář dal na jedinou stránku rozdělenou jQuery), ale mohl by sis vytvořit vlastní dočasný soubor. Místo automaticky vytvořeného pak budeš jen přesouvat (a přejmenovávat) dočasný soubor, nebo ho smažeš. Raději si ale počkej na jiné odpovědi, nejsem si jistý, jak bys na tom byl s rychlostí.

Nahoru Odpovědět
8.7.2015 14:31
Neaktivní uživatelský účet
Avatar
alfonz
Člen
Avatar
alfonz:8.7.2015 14:41

Hoď sem výpis $_FILES, proč ukládáš obsah files do session?

Nahoru Odpovědět
8.7.2015 14:41
lmao
Avatar
katrincsak
Člen
Avatar
Odpovídá na Neaktivní uživatel
katrincsak:8.7.2015 14:54

Jako jediné řešení uložit dočasně soubor/soubory jinam a pak přesunout mě napadlo taktéž, ale pro výsledek je to spíše nereálné. Když dotyčný nedokončí inzerci, tak soubor bude vyset a nedokážu si představit jak bych to promazával, tak abych náhodou neovlivnil někoho kdo tam zrovna taky něco vkládá a bez dokončení nemám prakticky identifikaci o dotyčném a nedokážu pak řádně s daty manipulovat.

Veškerá data se po celou dobu ukládají do SESSION a pak se zpracují.Rozdělené to mám hlavně kvůli přehlednosti pro uživatele.

Napadlo mě při psaní:
Leda že bych na místo SESSION updatoval MySQL po každé části formuláře. Tím pádem bych věděl ihned o koho se jedná, dokázal zapsat soubory k danému uživateli a když to nedokončí, tak by se to automaticky po nějakém čase smazalo. (To zní docela dobře)

Každopádně děkuji za snahu ;-)
Třeba je nějaké jiné řešení bez toho, aniž bych celou inzerci musel předělávat.

 
Nahoru Odpovědět
8.7.2015 14:54
Avatar
brambora
Člen
Avatar
Odpovídá na katrincsak
brambora:8.7.2015 14:59

http://stackoverflow.com/…-php-session

The $_FILES array only holds information about the file that has been uploaded in this request. If you do not save that file elsewhere within the same request, it will be removed by PHP at the end of the request.

Jednoduse receno, zpusob, kterym se snazis vec vyresit, nefunguje a fungovat nebude.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
8.7.2015 14:59
Avatar
katrincsak
Člen
Avatar
Odpovídá na alfonz
katrincsak:8.7.2015 15:04

Proč výpis?

Potřebuji přenést $_FILES['obrazky'] z jednoho formuláře na druhý a jakmile se formulář zpracuje, tak $_FILES['obrazky'] je již prázdný, takže jediné řešení je to někam uložit. Aktuálně uložím informace o souboru do SESSION, ale nikoliv samotný soubor a to je ten problém. Potřebuji soubory uložit až po dokončení celého procesu. V opačném případě by se mohlo stát, že 10x uživatel zopakuje zápis formuláře, protože u toho třeba vařil, nebo dělal něco jiného a tak by se nahrávali fotografie, které by nikam nepatřili. Proto to chci hezky uložit až po úplném dokončení spolu se zápisem do MySQL.

Možná ale vidím řešení v tom to ukládat po celou dobu do MySQL jen mezi pamět do SESSION,.

 
Nahoru Odpovědět
8.7.2015 15:04
Avatar
katrincsak
Člen
Avatar
Odpovídá na brambora
katrincsak:8.7.2015 15:05

I to je možné, že způsob je neřešitelný a musím jinak. Jestli to tak je což asi je, tak máš řešení ;-)

 
Nahoru Odpovědět
8.7.2015 15:05
Avatar
katrincsak
Člen
Avatar
katrincsak:9.7.2015 13:43

Řešení je tedy, že řešení tímto způsobem není.

  • Data budu po přesunu na další formulář rovnou ukládat do MySQL, ze které neúplné nebo neaktivní inzerce po nějakém čase automaticky smažu. Tím pádem mohu nahrát obrázky ihned, protože budu vědět o jaké ID uživatele jde a tím i tedy složku/fotografie.

Děkuji všem za snahu i těm blbcům co se neumí vyjádřit a jen dislajkujou, ať se jim hlavně spokojeně spí :-)

Editováno 9.7.2015 13:44
 
Nahoru Odpovědět
9.7.2015 13:43
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 14 zpráv z 14.