CONNEXION
  • RetourJeux
    • Tests
    • Soluces
    • Previews
    • Sorties
    • Hit Parade
    • Les + attendus
    • Tous les Jeux
  • RetourActu
    • Culture Geek
    • Astuces
    • Réalité Virtuelle
    • Rétrogaming
    • Toutes les actus
  • RetourHigh-Tech
    • Actus JVTECH
    • Bons plans
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTECH
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch
    • Xbox Series
    • Overwatch 2
    • FUT 23
    • League of Legends
    • Genshin Impact
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • PS4
  • One
  • Switch
  • Wii U
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Etoile Abonnement RSS

Sujet : PHP navigateur téléchargement

DébutPage précedente
1
Page suivantePage suivante
thetalc thetalc
MP
Niveau 11
27 mai 2015 à 10:31:43

Salut :)

J'ai un problème, j'ai une application (intranet pour l'instant, peut-être internet plus tard) sur le serveur de l'entreprise, je bosse dessus via ftp donc (je précise car je ne sais pas si ça a un lien).
Les utilisateurs de l'entreprise se connectent sur l'intranet et accèdent à l'appli.

Il y a un bouton qui permet d'extraire les données sous format csv, ok, cependant je n'arrive pas à faire télécharger le fichier par mon navigateur malgré tous les exemples que j'ai pu trouver sur internet, ex :

$file = 'monkey.gif';

if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
readfile($file);
exit;
}

Merci d'avance

Message édité le 27 mai 2015 à 10:32:29 par thetalc
deepblue deepblue
MP
Niveau 13
27 mai 2015 à 11:06:51

Il se passe quoi ?

thetalc thetalc
MP
Niveau 11
27 mai 2015 à 11:14:24

Rien justement, je voudrais que le fichier soit téléchargé par le navigateur mais rien ne se passe

Pseudo supprimé
Niveau 10
27 mai 2015 à 12:52:54

Déjà, ton content type n'est pas bon :
header('Content-Type: image/gif');

Apres, t'as essayé de voir ce que retourne file_exists ?

Edit: Et le exit a la fin...

Message édité le 27 mai 2015 à 12:55:15 par
thetalc thetalc
MP
Niveau 11
27 mai 2015 à 14:23:14

Oui le file_exists trouve renvoie true

Après cet exemple est celui que j'ai trouvé sur la doc php http://php.net/manual/fr/function.readfile.php, à l'origine je souhaite exporter un tableau dans un fichier csv récupérable

J'ai aussi vérifié avec d'autres navigateurs que chrome, rien ne se passe

Message édité le 27 mai 2015 à 14:24:32 par thetalc
Darkandgel Darkandgel
MP
Niveau 10
27 mai 2015 à 16:44:45

Donne nous ton code a toi

Sur js fiddle de préférence, ou au moins entre les balises <code>

thetalc thetalc
MP
Niveau 11
27 mai 2015 à 16:55:20

Il n'y a rien de plus que dans la doc, le script est dans un fichier php sur le serveur, l'image également
J'avais modifié "header('Content-Type: image/gif');" mais ça ne fonctionne pas non plus

<?php
   
    $file = '../files/images/logo.jpg';
    echo var_dump(file_exists($file)); //renvoie bien true
    if (file_exists($file)) {
          header('Content-Description: File Transfer');
          header('Content-Type: application/octet-stream');
          header('Content-Disposition: attachment; filename='.basename($file));
          header('Expires: 0');
          header('Cache-Control: must-revalidate');
          header('Pragma: public');
          header('Content-Length: ' . filesize($file));
          readfile($file);
          exit;
    }

Je suppose que le problème vient du fait que le projet soit sur un serveur distant ?

Message édité le 27 mai 2015 à 17:00:01 par thetalc
Pseudo supprimé
Niveau 10
27 mai 2015 à 17:57:03

Je viens de faire le test sur un serveur (distant) et en local

<?php
function fnc_path($string) {
    return str_replace(["/", "\\"], DIRECTORY_SEPARATOR, $string);
}

$file = fnc_path( dirname(__DIR__).'/files/images/logo.jpg' );

if (file_exists($file)) {
      header('Content-Description: File Transfer');
      header('Content-Type: image/jpg');
      header('Content-Disposition: attachment; filename='.basename($file));
      header('Expires: 0');
      header('Cache-Control: must-revalidate');
      header('Pragma: public');
      header('Content-Length: ' . filesize($file));
      readfile($file);
      exit;
}

Ca fonctionne très bien.

edit: var_dump affiche les informations d'une variable, pas de besoin de faire un echo en plus.

edit2: Le content-type doit etre du type de ton fichier, dans ton premier code c'est un gif mais dans ta deuxieme version c'est un jpg.

Message édité le 27 mai 2015 à 18:01:40 par
thetalc thetalc
MP
Niveau 11
28 mai 2015 à 09:48:01

Ok en fait ça n'a pas l'air de fonctionner car j'appelle le fichier php avec du ajax, si je cherche à accéder au fichier à la main ton code le télécharge

Je vais chercher sur cette voie merci !

Edit: et merci pour les infos dans les edits je ne savais pas :)

Message édité le 28 mai 2015 à 09:52:01 par thetalc
Pseudo supprimé
Niveau 10
28 mai 2015 à 13:17:22

Pour le faire en ajax c'est super simple, j'ai modifié le script php pour avoir un peut plus de souplesse.

download.php : http://pastebin.com/Rw9za65r
html + javascript : http://pastebin.com/XWTgPmy6

Si tu utilise jquery c'est le meme principe ( c'est plus court a écrire par contre :) ). Si tu ne comprends pas certains passages, n'hésites pas.

P.S : La partie php n'est pas sécurisée :mort:

Message édité le 28 mai 2015 à 13:17:45 par
thetalc thetalc
MP
Niveau 11
29 mai 2015 à 09:29:07

Ouaip c'est bon ça fonctionne merci :)

Je n'ai juste pas compris pourquoi la partie php n'est pas sécurisée ?

Pseudo supprimé
Niveau 10
29 mai 2015 à 10:58:19

Je ne suis pas un pro de la sécurité, mais la premère chose a savoir c'est qu'il ne faut jamais faire confiance aux données qui proviennent de l'utilisateur.

Les seules vérifications qui sont faites sont :
- Vérifier que le nom de fichier est bien renseigné
- Vérifier que le fichier existe

En fonction de l'architecture de tes dossiers, ca laisse la porte ouverte a pas mal d'abus, notement celui de télécharger autre chose que les images.

Je pense que la première chose a faire est de vérifier l'extension du fichier que l'utilisateur souhaite télécharger (pas de fichiers php par exemple).
Deuxieme chose, limiter l'argument file a un nom de fichier seul (pas de chemins relatifs ou absolus).

Je t'ai fait un exemple ici : http://pastebin.com/cJRefLLY
J'ai ajouté une fonction qui permet de valider le nom du fichier passé en argument.

edit: il y a une faute dans un des commentaires
//si l'extension du fichier n'est pas le tableau des extensions autorisés
qui devrait etre
//si l'extension du fichier n'est pas 'dans''' le tableau des extensions autorisés''

Message édité le 29 mai 2015 à 10:59:42 par
DébutPage précedente
1
Page suivantePage suivante
Répondre
Prévisu
?
Victime de harcèlement en ligne : comment réagir ?
Infos 0 connecté(s)

Gestion du forum

Modérateurs : Thymotep
Contacter les modérateurs - Règles du forum

Sujets à ne pas manquer

La vidéo du moment