Formulář neodešle data emailem, pokud do něj přidám přílohu
- Jarda_PT
- Člen | 6
Zdravím, předem upozorňuji, že jsem spíš hodně zvědavý nadšenec, než expert, případné reagující tak prosím o shovívavost :-)
Mám formulář, je to odpovědní formulář na pracovní nabídku, který
po vyplnění (email + prostý text + 1× checkbox + recaptcha) odesílá
vyplněné informace emailem zaměstnavateli a uchazeči, který ho vyplnil
potvrzení.
Pokud je součástí formuláře pouze email + text, formulář pošle oba
emaily bez sebemenších problémů.
Pokud přidám jednu přílohu, formulář pošle email pouze uchazeči,
zaměstnavateli ne, stránka hlásí Server error, a v logu chybu:
Nette\InvalidStateException: Unable to move uploaded file
‚/www/hosting/prace.tips/tmp/phpOoI1NE‘ to
‚/www/hosting/prace.tips/www/www/../temp/životopis.pdf‘. failed to open
stream: Permission denied
A pak ještě jedna varianta, pokud přidám 2 přílohy (je možno až 5),
formulář se tváří, že vše proběhlo ok, stránka error nehlásí,
uchazeč opět dostane email s potvrzením, ale zaměstnavatel zase nic.
Předpokládám, že formulář bude ok, problém bude s přílohou a jejím
putováním přes temp, kde se soubor dočasně ukládá a pak se při
odesílání formuláře, resp. emailu vytáhne a k emailu přiloží. Píšu
to dost neodborně, jde mi pouze o potvrzení správnosti této úvahy. Ještě
jedna věc, problém není ve velikosti souborů, jsou tam nastavené
dostatečné limity, ani na straně serveru, že by jakkoliv bránil
odesílání emailů s přílohami.
Všem předem díky za nasměrování a jakoukoli radu.
Editoval Jarda_PT (2. 4. 16:32)
- Kamil Valenta
- Člen | 815
- zdá se, že práva nemá
- ten adresář temp je aktuálně prázdný?
- není dobré skladovat přílohy v adresáři www/… kde je riziko, že budou dostupné z prohlížeče (může být podchyceno jinou konfigurací)
- Jarda_PT
- Člen | 6
Budu vypadat jako debil, ale nemohu ten adresář temp najít :(
8 let to fungovalo bezchybně, práva nikdo neomezil/neměnil
se skladováním na www/ souhlasím, je to udělaný od začátku špatně
celé se to sekne tady:
$attachment = $values->file->move($tempFile);
…/www/app/forms/JobContactForm/JobContactForm.php
$dest „/www/hosting/prace.tips/www/www/../temp/CV_Horáková.docx“ (60)
v souboru Nette\Http\FileUpload->move
Ve fileUpload to vypadá takto:
* Move uploaded file to new location.
* @param string
* @return static
*/
public function move($dest)
{
$dir = dirname($dest);
@mkdir($dir, 0777, TRUE); // @ - dir may already exist
if (!is_dir($dir)) {
throw new Nette\InvalidStateException("Directory '$dir' cannot be created. " . error_get_last()['message']);
}
@unlink($dest); // @ - file may not exists
Nette\Utils\Callback::invokeSafe(
is_uploaded_file($this->tmpName) ? 'move_uploaded_file' : 'rename',
[$this->tmpName, $dest],
function ($message) use ($dest) {
throw new Nette\InvalidStateException("Unable to move uploaded file '$this->tmpName' to '$dest'. $message");
}
);
@chmod($dest, 0777); // @ - possible low permission to chmod
$this->tmpName = $dest;
return $this;
}
Editoval Jarda_PT (3. 4. 12:08)
- Kamil Valenta
- Člen | 815
Ten adresář je přeci zde: /www/hosting/prace.tips/www/temp/
Je potřeba zjistit jeho vlastníka, skupinu a práva na něm. A porovnat
s tím, pod čím běží httpd.
- Kamil Valenta
- Člen | 815
Do adresáře s právy 755 může zapisovat jen vlastník (UID=33).
Pokud httd běží pod UID=1000, tak do něj nezapíše a proto to vykopne
Permission denied.
Jednou možností je dát uživatele UID=33 do skupiny GID=1000 a adresáři
www/temp dát práva 775 (zápis i pro skupinu),
nebo ten adresář smazat a vytvořit ho php skriptem, aby měl vlastníka
UID=1000 a pak do něj půjde zapisovat i při právech 755.