Otevření souboru z FTP – cesta

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Tymikes
Člen | 63
+
0
-

Zdravim,
upload souboru a mazání mi funguje s cestou dobře, ale pokud v latte vytvořím klasický odkaz.

<a href="{$priloha->cesta_souboru}">{$priloha->jmeno_souboru}</a></div>

generuje se mi následující odkaz:
domena.eu/data/web/virtuals/124211/virtual/www/domains/domena.tld/www/upload/login.png

Ale soubor je na adrese
domena.eu/domains/domena.tld/www/upload/login.png

Chtěl bych se zeptat, jestli už v tuto chvíli se musím nějak hrabat v routování (protože jsem to do teď vůbec neřešil a ještě se do toho nechci pouštět) a ještě jestli je nějaký lepší způsob, jak stahovat přílohu (resp. více bezpečnější, protože momentálně si jí může stáhnout každý).

Editoval Tymikes (7. 4. 2016 14:46)

greeny
Člen | 405
+
0
-

Vyrob odkaz takhle:

<a href="{$basePath}{$priloha->cesta_souboru}">{$priloha->jmeno_souboru}</a></div>

A mělo by ti to fungovat

Tymikes
Člen | 63
+
0
-

Nefunguje. Tedy přesněji na localhostu mi odkaz nefunguje vůbec. Na serveru se udělá, ale špatný a basepath nepomáhá.

greeny
Člen | 405
+
0
-

Jak máš uložené cesty v DB?

Tymikes
Člen | 63
+
0
-

localhost je ukládá
D:\Programy\XAMPP\htdocs\Ukol\www\upload/g.png

webový
/data/web/virtuals/124211/virtual/www/domains/domena.tld/www/upload/g.png

docky
Člen | 59
+
0
-

Ukládej si do db jen například /upload/g.png

Tymikes
Člen | 63
+
0
-

No, nakonec asi použiju výše zmiňovaný

<a href="{$basePath}/upload/{$priloha->jmeno_souboru}">{$priloha->jmeno_souboru}</a></div>

Takto to šlape

Editoval Tymikes (7. 4. 2016 16:48)

Tymikes
Člen | 63
+
0
-

Otevrím téma, abych nemusel vytvářet nový, snažím se o stažení souboru přes readfile. Nefunguje ani na ostrém serveru ani v localhostu (unlink např. funguje), zkoušel jsem víc druhů cesty, mám i cestu přímo vytvořenou v db (viz. výše) např.:

public function actionStahnoutPrilohu($id_ukolu) {
    $soubor = $this->ukoly->getSouborByID($id_ukolu);
    $cesta = $this->getHttpRequest()->getUrl()->getBasePath()."upload/";
    if (file_exists($soubor->cesta_souboru)) {
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename="'.basename($soubor->nazev_souboru);
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header('Content-Length: ' . filesize($soubor->velikost_souboru));
        readfile($cesta . $soubor->jmeno_souboru);
        exit;
  }}

Editoval Tymikes (16. 4. 2016 19:03)

CZechBoY
Člen | 3608
+
0
-

Co znamená, že to nefunguje?

David Matějka
Moderator | 6445
+
+1
-

kdyz ctes z file systemu, tak te nezajima zadna URL. Zajima te ten adresar, kde je to fyzicky ulozeny

Tymikes
Člen | 63
+
0
-

Nefunguje znamená, že mi napíše. Soubor nenalezen.
Firefox nemůže nalézt soubor domain.eu/domains/domains.tld/ukol/stahnout-prilohu?id_ukolu=18

Adresář mám v db uložený právě takto
/data/web/virtuals/124211/virtual/www/domains/domena.tld/www/upload/g.png a přes něj se to taky nechytne, jak se odstanu teda k www/upload? Někde na fóru jsem našel konstantu WWW_DIR, ale nefunguje mi.

Editoval Tymikes (15. 4. 2016 16:15)

CZechBoY
Člen | 3608
+
0
-

Co znamená, že se to nechytne? Když dáš tu cestu napevno?

Tymikes
Člen | 63
+
0
-

Jo, pro mě adresa na pevno je to, co mě vygeneruje následující třída.

<?php
    namespace App\Services;

    class WebDir {

        private $wwwDir;

        public function __construct($wwwDir) {
            $this->wwwDir = $wwwDir;
        }

        public function getPath($fromBaseDir=''){
            return $this->wwwDir.DIRECTORY_SEPARATOR.$fromBaseDir;
        }
    }

A pak přidávám soubor např.

$cesta_souboru = ($this->webDir->getPath('upload/' . $jmeno));

A v localhostu to generuje, jak jsem psal výše.

localhost je ukládá
D:\Programy\XAMPP\htdocs\Ukol\www\upload/g.png
/data/web/virtuals/124211/virtual/www/domains/domena.tld/www/upload/g.png

Můžu zkusit tam dát úplně ručně, sice budu tipovat od jaké části mám začít.

CZechBoY
Člen | 3608
+
0
-

Vsak zacni od zacatku.
Zkontroluj jestli to generuje správně cestu.
Zkontroluj jestli ten soubor opravdu existuje.

Tymikes
Člen | 63
+
0
-

Tak jsem to zkoušel mazal jsem postupně každou část cesty a nic se nechytlo.
Teď momentálně má být
domena.eu/upload/asdasd.png

readfile('/upload/'.$soubor->jmeno_souboru);

Ani ostatní prostě nezobrazí, ale když zadám do url tak tam obrázek je. :/

David Matějka
Moderator | 6445
+
0
-

Pri praci se soubory z php musis pracovat s kompletni cestou, kde je to ulozeny na disku – tedy vcetne nejakeho wwwDir, stejne jako kdyz soubor ukladas.

CZechBoY
Člen | 3608
+
0
-

Zkus tuhle cestu:
/data/web/virtuals/124211/virtual/www/domains/domena.tld/www/upload/g.png
pokud tam teda něco je…

Editoval CZechBoY (16. 4. 2016 15:56)

Tymikes
Člen | 63
+
0
-

//Tak to bylo v tomto.

header('Content-Disposition: attachment; filename="'.basename($soubor->nazev_souboru);

Chtělo to zase plnou cestu, jsem totiž viděl jen filename a už jsem tam hned narval jen název -.-

header('Content-Disposition: attachment; filename="'.basename($soubor->cesta_souboru);

Díky hoši :) opět pořešeno :)

Editoval Tymikes (16. 4. 2016 19:13)

David Matějka
Moderator | 6445
+
0
-

filesize($soubor->velikost_souboru)

tohle je spatne. Filesize vraci velikost pro nazev souboru, ktery tam predas.

Tymikes
Člen | 63
+
0
-

Jo ta velikost je taky špatně :)