2009-11-26 3 views
6

Je souhaite renommer un fichier lorsque l'utilisateur le télécharge.Renommer des fichiers lors du téléchargement

À l'heure actuelle, j'envoie des en-têtes content-disposition et content-length, puis j'envoie un fichier à l'utilisateur avec la fonction PHP fpassthru.

Mais il y a 3 problèmes avec cette méthode:

  1. Si j'envoie grand (au-dessus 3-4Gb) fichiers de cette façon, alors mon script PHP fonctionne trop de temps et peut être tué par temps mort.
  2. Si l'utilisateur annule le téléchargement, le script PHP continuer à lire et envoyer le fichier
  3. Si l'utilisateur fait une pause le téléchargement, il ne peut pas le reprendre plus tard.

Existe-t-il une meilleure façon de renommer les fichiers lors du téléchargement?

Répondre

12
<?php 
header('Content-type: application/pdf'); 

// It will be called downloaded.pdf 
header('Content-Disposition: attachment; filename="downloaded.pdf"'); 

// The PDF source is in original.pdf 
readfile('original.pdf'); 
?> 
  1. Le fichier sera proposé en téléchargement comme "downloaded.pdf" alors que son nom original était "original.pdf".

Pseudo Code

while(1) { 
    Echo "..."; //<-- send this to the client 
    if (connection_status()!=0){ 
    die; 
    } 
} 
  1. Vous pouvez arrêter le script PHP si un utilisateur annule le navigateur en utilisant connection_status()

  2. HTTP ne peut pas se reconnecter une connexion fermée. FTP peut!

+0

Très bien. C'est exactement ce que je fais maintenant, en utilisant seulement la fonction fpassthru au lieu de readfile. Mais comment votre solution aidera à résoudre ces trois problèmes que j'ai pointés dans ma question? – Boffin

1

Pour le troisième point, vous pouvez essayer d'utiliser les en-têtes HTTP Range.
Si l'utilisateur dispose d'un client de téléchargement compatible CV, il doit envoyer ces en-têtes à votre script, que vous pouvez utiliser pour localiser exactement les parties du fichier à envoyer.

12

Depuis on a posé la question, un peu de temps a passé et html5 nous a donné une approche différente de celle-ci:

<a href="someWeiredFileName.rar" download="coolFilename.rar">Download</a> 

Le attributetélécharger (learn more) définit la valeur par défaut filename pour stocker le fichier sur la l'ordinateur des clients (il sera toujours capable de le changer!).

Remarque: cela n'affectera rien sur votre serveur.

+0

Intéressant, Cela pourrait éviter beaucoup de code côté serveur, mais ne fonctionne pas sur l'héritage Old Chap IE. –

+0

@RienNeVaPlus, Son fonctionne bien pour le système Windows, mais pas pour le système Linux. Toute idée comment pouvons-nous l'obtenir pour le système Linux? – kalidasan

Questions connexes