2017-08-21 3 views
0

J'ai un problème avec le téléchargement de pdf à partir du serveur local. J'ai une URL vers un fichier de document (exemple: \ 10.10.10.10 \ directory \ 123_ABC.pdf). Je dois faire la fonction php qui télécharger le fichier de l'URL et le montrer dans le navigateur Web. L'accès à ce répertoire est protégé (nom d'utilisateur et mot de passe). Je ne sais pas comment je peux télécharger ce fichier. Peut-être curl? C'est possible?PHP et télécharger le fichier pdf à partir du serveur local

J'ai essayé ceci:

$login = 'LOGIN'; 
$password = 'PASSOWRD'; 
$host = "http://10.10.10.10/directory/123_ABC.pdf"; 
$CurlConnect = curl_init(); 
curl_setopt($CurlConnect, CURLOPT_URL, $host); 
curl_setopt($CurlConnect, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($CurlConnect, CURLOPT_USERPWD, $login.':'.$password); 
$Result = curl_exec($CurlConnect); 

header('Cache-Control: public'); 
header('Content-type: application/pdf'); 
header('Content-Disposition: attachment; filename="new.pdf"'); 
header('Content-Length: '.strlen($Result)); 
v($Result) ; 

Le fichier new.pdf est affiché dans le navigateur, mais il est cassé.

EDIT: J'ai résolu le problème. Je n'ai pas pu télécharger le fichier pdf car j'ai utilisé un mauvais protocole. Ce code est correct:

$login = 'LOGIN'; 
$password = 'PASSOWRD'; 
$host = "ftp://10.10.10.10/directory/123_ABC.pdf"; 
$CurlConnect = curl_init(); 
curl_setopt($CurlConnect, CURLOPT_URL, $host); 
curl_setopt($CurlConnect, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($CurlConnect, CURLOPT_USERPWD, $login.':'.$password); 
$Result = curl_exec($CurlConnect); 
curl_close ($ch); 
header('Cache-Control: public'); 
header('Content-type: application/pdf'); 
header('Content-Disposition: attachment; filename="new.pdf"'); 
header('Content-Length: '.strlen($Result)); 
echo $Result; 
+0

Quelle méthode est utilisée pour protéger ce fichier par mot de passe? Authentification HTTP? – Nima

+0

Définissez les données d'en-tête sur application/pdf et utilisez echo file_get_contents(); et meurt(); – Bernhard

Répondre

-1

Vous pouvez utiliser file_put_contents pour télécharger le fichier depuis l'URL sur votre serveur.

file_put_contents("example.pdf", fopen("http://10.10.10.10\directory\123_ABC.pdf","rb")); 
+0

le fopen est juste un gaspillage, à condition que 'allow_url_fopen' soit activé, file_put_contents récupère les URL http aussi bien que fopen, mais s'il est désactivé, aucun d'eux ne fonctionnera. et comment le télécharger avec un nom d'utilisateur et mot de passe dépend de la méthode d'authentification utilisée, mais dans tous les cas, c'est une mauvaise approche, vous ne fournissez aucun nom d'utilisateur/mot de passe dans cet extrait – hanshenrik

+0

@hanshenrik le fopen ouvre l'URL avec le attributes et file_put_contents diffuseront le fichier ouvert. Oui, les conditions seront les deux devraient être maintenues ouvertes. –

0

Quote: The file new.pdf is displayed in the browser, but it is broken - qui est incorrect, le fichier pdf n'est pas affiché dans le navigateur, mais parce que vous avez envoyé l'en-tête header('Content-Disposition: attachment; filename="new.pdf"');, dit le navigateur que vous envoyez un fichier pdf, le navigateur essayer de Rendez votre page d'erreur déconnectée en format pdf, et parce que HTML (dont votre page d'erreur est probablement déconnectée) et PDF sont 2 formats complètement différents, l'analyseur pdf ne peut pas le rendre (la différence la plus drastique est que HTML est basé sur du texte , et PDF est un format binaire)

comment se connecter dépend du système de connexion utilisé par le serveur. curl a un support intégré pour quelques types, à savoir HTTP Basic authentication et HTTP Digest authentication et HTTP NTLM authentication, dont la plupart sont normalisés, mais aucun de ceux qui sont largement utilisés. probablement, ils utilisent un schéma de connexion personnalisé que vous devrez implémenter vous-même. le schéma le plus commun consiste à envoyer le nom d'utilisateur et le mot de passe à une page de connexion, puis la page de connexion fournit un session id dans un cookie, et vous devez utiliser ce cookie pour accéder à toutes les pages nécessitant une connexion (par exemple, stackoverflow. com, wikipedia.com, et facebook.com ont tous leur propre version de ce schéma cookie-session-id) - vous devrez trouver quel schéma de connexion le serveur utilise, avant que quiconque ici ne puisse vous dire comment vous connecter. Cependant, si vous avez de la chance, ils utilisent l'un des (rares) systèmes intégrés pour boucler, auquel cas vous devrez utiliser CURLOPT_HTTPAUTH avec CURLOPT_USERPWD pour vous connecter .. la méthode utilisée pour se connecter est mieux déduite par étudier la page de connexion. Quels en-têtes http et quel corps obtenez-vous lorsque vous vous rendez à la page de connexion de votre navigateur? dans Google Chrome, vous pouvez le voir en appuyant sur Ctrl + Maj + I, puis en allant sur l'onglet "Réseau" avant de naviguer jusqu'à la page de connexion, puis naviguer jusqu'à la page, vous devriez voir la demande dans l'onglet Réseau, là vous peut voir les en-têtes reçus et envoyés et le corps de la réponse (généralement html)