[PHP] Download z ftp

0

Witam!
Robię prostego klienta do uploadu i dowloadu w php.
Upload poszedł bez problemu, ale mam problem z downloadem - mecze się już trzeci dzień:/ Dostęp do ftp dla kilku użytkowników na login i hasło.
Jak najprościej napisać w php kod którym użytkownicy mogliby ściągać pliki z ftp? Do ftp użytkownik ma dostęp na zasadzie, ze logując się do niego zostaje wrzucony do własnego katalogu ftp.
Próbowałem już z ftp://login:haslo@adres/katalog/plik , ale przy tym myku otwiera mi po prostu ten plik w przeglądarce.
Z góry WIELKIE DZIĘKI za pomoc!:)

0
Vendro napisał(a)

http://pl.php.net/ftp_get
http://forum.php.pl/index.php?showtopic=53933

ale ja potrzebuje "Zapisz jako..."

0
cinus1980 napisał(a)
Vendro napisał(a)

http://pl.php.net/ftp_get
http://forum.php.pl/index.php?showtopic=53933

ale ja potrzebuje "Zapisz jako..."

Jeżeli przeglądarka dostanie nagłówek "text/plain" to wyświetli to jako plik tekstowy. Aby zapisać taki plik na dysku masz dwa podejścia:

  • wysyłasz cały plik za pomocą skryptu php i modyfikujesz odpowiednio nagłówek (czyli nie ww. text/plain)
  • drugie podejście, bardziej wydajne. Ustawiasz sobie osobną subdomenę na pliki ściągane z ftp, w ustawieniach serwera www, ustawiasz dla tej domeny, żeby wszystkie serwowane pliki szły z odpowiednim nagłowkiem.
    Ten odpowiedni nagłówek to bodajże application/octet-stream ale głowy nie dam.
0

dzięki za pomoc udało mi się to zrobić (na końcu umieszczam kod dla potomnych;)
...ale mam jeszcze jeden problem...
Jak rejestrować, czy dany plik został ściągnięty... nie chodzi mi jedynie, czy został kliknięty przycisk "Pobierz", ale potrzebuje info, że dany plik został w całości ściągnięty przez użytkownika.
Z góry dzięki za pomoc:)

P.S.
kod dla potomnych
[quote]<? $attachment_location = 'ftp://login:haslo@server/'.$_POST['katalog'].'/'.$_POST['plik']; $conn_id = ftp_connect("server"); // Open a session to an external ftp site $login_result = ftp_login ($conn_id, "login", "haslo"); // Check open if ((!$conn_id) || (!$login_result)) { echo "Ftp-connect failed!"; die; } else {} ftp_chdir($conn_id, $_POST['katalog']); header('Content-Type: application/force-download'); header('Content-Disposition: attachment; filename="'.basename($attachment_location).'"'); readfile($attachment_location); ?>[/quote]

0

a wie ktoś w jaki sposób mogę odświeżyć stronę w momencie wysylki z której wysyłam dane do w/w skryptu?

0
cinus180 napisał(a)

Jak rejestrować, czy dany plik został ściągnięty... nie chodzi mi jedynie, czy został kliknięty przycisk "Pobierz", ale potrzebuje info, że dany plik został w całości ściągnięty przez użytkownika.
Funkcja, której używasz do przesłania pliku, wrzuca przeczytany plik do bufora wyjściowego i się nim już więcej nie interesuje. Wydaje mi się, że tylko z serwera możesz wyciągnąć informację o tym, że plik został do końca pobrany.

cinus1980 napisał(a)

a wie ktoś w jaki sposób mogę odświeżyć stronę w momencie wysylki z której wysyłam dane do w/w skryptu?
Nie bardzo kumam o co Ci chodzi :>

0
graf.zero napisał(a)

Nie bardzo kumam o co Ci chodzi :>

Chodzi mi mianowicie o to, że są dwa pliki:
*plik index.php o zawartości:

<form name="form1" METHOD="POST" ACTION="download.php">
<input name="unit" type="hidden" value="..."/>
...
...
<input  type="submit" ....>
</form>
<--...tutaj lista plików do ściągnięcia...-->

*plik download.php:

<?
$attachment_location = 'ftp://login:haslo@server/'.$_POST['katalog'].'/'.$_POST['plik'];
$conn_id = ftp_connect("server");
// Open a session to an external ftp site
$login_result = ftp_login ($conn_id, "login", "haslo");
// Check open
if ((!$conn_id) || (!$login_result)) {
    echo "Ftp-connect failed!"; die;
} else {}
ftp_chdir($conn_id, $_POST['katalog']);
header('Content-Type: application/force-download');
header('Content-Disposition: attachment; filename="'.basename($attachment_location).'"');
readfile($attachment_location);
<--tutaj jest połączenie z bazą danych i rejestracja faktu kliknięcia "ściągnij" w bazie danych (już pomijam, czy plik się ściągnął, czy nie)...-->
?>

i teraz chodzi mi o to, że nie mogę znaleźć sposobu, by automatycznie odświeżyć stronę index.php w momencie, gdy w bazie została zapisana informacja o kliknięciu ściągnij (czyli wykonanie końcówki kodu z pliku "download.php")...
nadmienie jeszcze, że w tej chwili przeglądarka zachowuję się tak, iż plik się ściąga (wszystko OK), a w przeglądarce pozostaje strona index.php (nie przeładowuje się)...

0

Serwer sam z siebie nie wyśle Ci żadnej informacji. Musisz o to zadbać samemu, czyli np. dorzucić do formularza jakieś pole z losową/unikalną wartością, w pliku download.php należy zapisać tą wartość na sesji, a ajaksem ze strony index.php odpytywać się co jakiś czas o to, czy już został wyświetlony plik. Ta metoda pozwoli Ci na dodatkową kontrolę poprawnego otwarcia pliku, obsługi jakiś błedów, które zgłasza funkcja readfile().

Innym rozwiązaniem jest założenie, że plik ściągnie się zawsze i na akcję formularza onsubmit, wywołać swoją funkcję napisaną w javascripcie, która wykona akcję submit na formularzu oraz podmieni odpowiednie dane na stronie (bądź po prostu odświeży stronę).

0
graf.zero napisał(a)

Innym rozwiązaniem jest założenie, że plik ściągnie się zawsze i na akcję formularza onsubmit, wywołać swoją funkcję napisaną w javascripcie, która wykona akcję submit na formularzu oraz podmieni odpowiednie dane na stronie (bądź po prostu odświeży stronę).

Poszedlem za Twoja druga podpowiedzią z tym, że mając kod:

   var http_request = false;
   function makePOSTRequest(url, parameters) {
      http_request = false;
      if (window.XMLHttpRequest) { // Mozilla, Safari,...
         http_request = new XMLHttpRequest();
         if (http_request.overrideMimeType) {
         	// set type accordingly to anticipated content type
            //http_request.overrideMimeType('text/xml');
            http_request.overrideMimeType('text/html');
         }
      } else if (window.ActiveXObject) { // IE
         try {
            http_request = new ActiveXObject("Msxml2.XMLHTTP");
         } catch (e) {
            try {
               http_request = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {}
         }
      }
      if (!http_request) {
         alert('Cannot create XMLHTTP instance');
         return false;
      }
      
      http_request.onreadystatechange = alertContents;
      http_request.open('POST', url, true);
      http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      http_request.setRequestHeader("Content-length", parameters.length);
      http_request.setRequestHeader("Connection", "close");
      http_request.send(parameters);
   }

   function alertContents() {
      if (http_request.readyState == 4) {
         if (http_request.status == 200) {
            //alert(http_request.responseText);
            result = http_request.responseText;
            document.getElementById('myspan').innerHTML = result;            
         } else {
            alert('There was a problem with the request.');
         }
      }
   }
   
   function get(obj,i) {
      elem1 = document.getElementById("unit_" + i);
      elem2 = document.getElementById("plik_" + i);
      elem3 = document.getElementById("id_docs_" + i);
      elem4 = document.getElementById("id_user_" + i);

      //alert(elem1.value);
      var poststr = "unit=" + elem1.value  +
                    "&plik=" + elem2.value +
                    "&id_docs=" + elem3.value +
                    "&id_user=" + elem4.value;
      makePOSTRequest('pliki/download.php', poststr);
   }

wyświetla mi plik w div'ie "myspan" - zamiast go się po prostu ściągnąć...
przypuszczam, że musze zmienić linie:

 result = http_request.responseText;

ale nie wiem na jaką:(
przegooglowalem już masę stron i nic:(

0

ja ta druga opcje zrozumialem w ten sposob:

<script>
function changePageContent() { ... }
function doSubmit(form_ptr)
{
    changePageContent();
    form_ptr.submit();
}
</script>
...
<form onsubmit="doSubmit(this); return false;">...</form>
0

witam a ja mam inny problem a mianowicie.. chce przerobic scrypt a mianowicie dodac do niego opcje multidownloadu do www / i nie wiemk jak on powinien wygladac.. czy mogl bym ktos podac jakis przykladowy scrypt jak powinien wygladac???

0

"Nowy temat" nie gryzie. Przykładowego skryptu nie ma, jak nie umiesz napisać to pogrzeb w manualu php.

1 użytkowników online, w tym zalogowanych: 0, gości: 1