web-dev-qa-db-fra.com

Le téléchargement Mp4 force le navigateur à lire le fichier au lieu du téléchargement

Sur mon site Web, je diffuse le contenu des utilisateurs mp4. J'autorise également les utilisateurs à télécharger . Cependant, dans Chrome, il semble que le fichier soit lu automatiquement dans un lecteur interne au lieu de le télécharger.

Comment puis-je forcer le navigateur à télécharger le fichier à la place.

Cordialement et merci Craig

10
Craig Mc

Vous devez utiliser l'en-tête HTTP " Content-Disposition " et ' Content-Type: application/force-download ' qui obligera le navigateur à télécharger le contenu au lieu de l'afficher à cet emplacement. 

Selon la langue côté serveur, l'implémentation diffère. En cas de 

PHP: 

    header('Content-Disposition: attachment; filename="'.$nameOfFile.'"');

fera le travail pour vous. 

Bien sûr, pour simplifier et généraliser cela pour tous vos fichiers, vous devrez peut-être écrire une méthode qui acheminera un lien vers du contenu téléchargeable. 

Le lien que vous pouvez montrer dans le HTML sera comme: 

<a href="http://yoursite.com/downloadFile?id=1234">Click here to Download Hello.mp4</a>

Et du côté serveur, vous avez besoin d’un script appelé/downloadFile (en fonction de votre routage), récupérez le fichier par son identifiant et envoyez-le à l’utilisateur en pièce jointe. 

<?php

 $fileId = $_POST['id'];

 // so for url http://yoursite.com/downloadFile?id=1234 will download file
 // /pathToVideoFolder/1234.mp4
 $filePath = "/pathToVideoFolder/".$fileId."mp4";
 $fileName = $fileId."mp4"; //or a name from database like getFilenameForID($id)
 //Assume that $filename and $filePath are correclty set.
header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename="'.$filename.'"');
header('Content-Type: application/force-download');
readfile($filePath);

Ici, 'Content-Type: application/force-download' force le navigateur à afficher l'option de téléchargement, quel que soit le réglage par défaut pour un type mime. 

Quelle que soit votre technologie côté serveur, les en-têtes à surveiller sont les suivants: 

'Content-Description: File Transfer'
'Content-Type: application/force-download'
'Content-Disposition: attachment; filename="myfile.mp4"
11
Srijith Vijayamohan

On dirait que vous utilisez un href direct sur le MP4. Si vous utilisez une langue du côté du serveur (i.e.asp.net, php, etc.) sur votre site Web, vous pouvez forcer le téléchargement. En asp ou .net, vous pouvez utiliser HttpHandlers avec "content-disposition", "attachment; filename; nomfichier.ext" ou renvoyer File () ActionResult dans MVC. Faites-moi savoir si vous pouvez utiliser n'importe quel code côté serveur et je peux fournir du code. 

Vous pouvez également essayer l'attribut de téléchargement html5: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a?redirectlocale=en-US&redirectslug=HTML%2FElement%2Fa#attr-download

i.e. <a href="http://www.w3schools.com/images/myw3schoolsimage.jpg" download="downloadfilename">

Ou bien, essayez javascript/jQuery. Voici un plugin: http://johnculviner.com/jquery-file-download-plugin-for-ajax-like-feature-rich-file-downloads/

7
johnnyarguelles

La définition de l'en-tête Content-Disposition devrait y remédier.

Content-Disposition: attachment; filename=whatever.mp4;

Soit dans les paramètres du serveur, soit dans le prétraitement de la page.

1
Matt Rink

Vous pouvez le faire de plusieurs manières. Je ne suis pas sûr que vous utilisiez IIS ou Apache et le langage côté serveur que vous utilisez, mais les techniques sont similaires pour tous.

Vous pouvez ajouter le type application/octect-stream de type MIME à l’extension .mp4 dans votre IIS ou à Apache, afin que tous les fichiers portant l’extension .mp4 soient affichés avec une invite de téléchargement. C’est le moyen le plus simple et le plus sûr d’afficher le message "télécharger".

Plz voir l'exemple ci-dessous.

http://www.codingstaff.com/learning-center/other/how-to-add-mime-types-to-votre-serveur

Dans l'exemple ci-dessus, au lieu de définir les extensions video/mp4 fpr .mp4, changez-le en application/octect-stream

En outre, la même chose peut être faite via le code côté serveur (code PHP). Le code sera similaire à ASP.NET également, veuillez consulter Google pour "forcer le téléchargement de fichier".

$file_url = 'http://www.myremoteserver.com/file.mp4';
header('Content-Type: application/octet-stream');
header("Content-Transfer-Encoding: Binary"); 
header("Content-disposition: attachment; filename=\"" . basename($file_url) . "\""); 
readfile($file_url);
0
Aby

si vous voulez une solution multi-navigateur

vous avez besoin d'un code côté serveur pour télécharger le fichier

exemple: Je travaille sur la technologie jsp, si vous pouvez utiliser jsp sur votre site web, vous pouvez essayer le code suivant dans le fichier download.jsp:

<%@ page import="Java.io.*, Java.lang.*, Java.util.*" %>
<%
String filename=request.getParameter("filename");   
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition",
"attachment;filename="+filename);
 %>

<%
/*
 File file = new File(filepath+filename );*/
 String path = getServletContext().getRealPath("/mp4/"+filename); 
 File file = new File(path);
FileInputStream fileIn = new FileInputStream(file);
ServletOutputStream out1 = response.getOutputStream();

byte[] outputByte = new byte[4096];
//copy binary contect to output stream
while(fileIn.read(outputByte, 0, 4096) != -1)
{
    out1.write(outputByte, 0, 4096);
}
fileIn.close();
out1.flush();
out1.close();
 %>

vous pouvez mettre le code ci-dessus dans un fichier: download.jsp

alors dans vos liens de page vous l'utiliserez comme:

<a href="download.jsp?filename=song1.mp4">song1</a>

avec mes meilleurs voeux

0
Anas2004