Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: CodeIgniter dynamiczne pobieranie
Forum PHP.pl > Forum > XML, AJAX
Zatarra
Witam,
Zacznę od tego że używam frameworka CI (który, pozwala ładować inne widoki tylko z metodą $this->load->view();, wied iframe mi nie wychodzi).

Ja chciałem zrobić prostą rzecz. Mam umieszczony plik na swoim serwerze w katalogu data. Chcę go pobrać bez odswiezania strony. Pomysł był taki żeby zrobić przycisk po ktorego kliknięciu przekazuje adres do ukrytej ramki w której wrzucę headery odpowiedzialne za pobranie pliku:

(widok pierwszy)
Kod
<input class="przycisk" type="submit" name="download" onClick="java script:tryToDownload('pobierz_error_sheet');" value="Pobierz arkusz zawierający błędy" title="Download" />
<script language="javascript">
    function tryToDownload(url)
    {

        oIFrm = document.getElementById('myIFrm');
        oIFrm.src = url;
        alert(url);

    }
    window.onload = setTimeout('tryToDownload("fileloader.php?fileName=test.rar")', 10*1000);
</script>

<iframe id="myIFrm" src="" style="visibility:hidden">

</iframe>


(zawartość ramki)
Kod
<?php

$filename = 'CMD_with_error_sheet.xls';
$dir = 'C:/xampp/htdocs/cmdb/main/data/';
$file_extension = strtolower(substr(strrchr($filename,"."),1));

//First, see if the file exists
    if( (!is_file($dir.$filename)) || (!file_exists($dir.$filename)) )
    {
        echo "Błąd: Nieznaleziono pliku. ".$dir.$filename;
    }
    else
    {
    //This will set the Content-Type to the appropriate setting for the file
    switch( $file_extension )
    {
        case "pdf": $ctype="application/pdf"; break;
        case "doc": $ctype="application/msword"; break;
        case "xls": $ctype="application/vnd.ms-excel"; break;
        //The following are for extensions that shouldn't be downloaded (sensitive stuff, like php files)
        case "php":
        case "htm":
        case "html":
        case "txt": die("<b>Cannot be used for ". $file_extension ." files!</b>"); break;

        default: $ctype="application/force-download";
    }
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private",false);
    header("Content-Type: ".$ctype);
    header("Content-Disposition: attachment; filename=\"".basename($filename)."\";" );
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: ".filesize($dir.$filename));
    readfile($dir.$filename);
    }
?>


ale w CI chyba nie ma takiej opcji..

Jest ktoś w stanie mi pomóc. Niestety nie znam się na ajaxie sad.gif a tutaj jeszcze ten Ci mnie dobija sad.gif szukałem googlowałem ale nie wiele mi to dało. Pozdrawiam wszytkich smile.gif
qrooel
http://codeigniter.com/user_guide/helpers/...oad_helper.html

Pliki pobierać bez odświeżania strony? Przecież to jest normalne działanie, bo plik jest pobierany w osobnej akcji. Nie potrzebujesz do tego żadnego ajaksa.

Na marginesie, 'javascript' piszemy razem.
Zatarra
dzięki za odp. Mam coś takiego:
z widoku aktualizuj mam pobieranie excela potem jest weryfikowanie poprawności struktury tego excela po czym tworzony jest mniejszy eksel z bledami. Ten własnie mniejszy excel jest umieszczony w katalogu data. wracając do widoków. Gdy załadowany excel zostaje zweryfikowany i umieszczony na serwerze to ponownie załadowany widok posiada informacje że plik zostal załadowany i można pobrać mniejszy plik z błędami po kliknięciu przycisku. Chodzi o to że ja nie dochodze do tego odświeżonego widoku nawet tą metodą co zaproponowałeś. Poprostu zanim mi się przeładuje widok to mniejszy plik już jest pobierany na samym początku. Tak to wyglądać powinno:

aktualizuj -> (wrzucenie dużego excela) -> odświeżanie widoku /weryfikacja excela -> odswierzony widok aktualizuj -> po kliknięciu na przycisk pobierz mniejszy arkusz z błędami przeładowanie widoku aktualizuj -> początkowy widok aktualizuj.

a jest tak

aktualizuj -> pobiera się mniejszy arkusz (widok nie zdążył się przeładować

chcę teraz zrobić to za pomocą funkcji anchor:
ale jak wklejam link:
http://C:/xampp/htdocs/abc/main/data/error_sheet.xls
zamienia mi na:
http://c/xampp/htdocs/abc/main/data/error_sheet.xls
(czyli bez ":")
nie wiem jak ustawić w rewrite_mod żeby mi nie kasowało dwukropka sad.gif

Kod
RewriteEngine on
#RewriteCond $1 !^([a-zA-z0-9/:])
#RewriteRule ^(.*)$ index.php [L]
RewriteCond $1 !^(index.php|images|robots.txt|system|user_guide|css|js)
RewriteRule ^(.*)$ index.php/$1 [L]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d


plik konfuguracyjny:
Kod
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';


plik helper_uri
Kod
* Anchor Link
*
* Creates an anchor based on the local URL.
*
* @access    public
* @param    string    the URL
* @param    string    the link title
* @param    mixed    any attributes
* @return    string
*/
if ( ! function_exists('anchor'))
{
    function anchor($uri = '', $title = '', $attributes = '')
    {
        $title = (string) $title;

        if ( ! is_array($uri))
        {
            $site_url = ( ! preg_match('!^\w+://! i', $uri)) ? site_url($uri) : $uri;
        }
        else
        {
            $site_url = site_url($uri);
        }

        if ($title == '')
        {
            $title = $site_url;
        }

        if ($attributes != '')
        {
            $attributes = _parse_attributes($attributes);
        }

        return '<a href="'.$site_url.'"'.$attributes.'>'.$title.'</a>';
    }
}


Witam ponownie rozwiązałem problem w ten sposób że użyłem helpera
Kod
$this->load->helper('download');
Dzieki za odpowiedz przedmówcy która mnie na to naprowadziła i użyłem anchora w którym target == _self. Pozdrawiam wszystkich i dziękuję za pomoc, zwałszcza przedmówcy smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.