2010-05-31 6 views
2

J'ai un servlet qui construisent réponse à une demande de fichier multimédia en lisant le fichier du serveur:Lire un film quicktime à partir d'une servlet dans une page Web?

File uploadFile = new File("C:\\TEMP\\movie.mov"); 
FileInputStream in = new FileInputStream(uploadFile); 

Ensuite, écrire ce flux dans le flux de réponse. Ma question est comment puis-je lire le fichier multimédia dans la page web en utilisant embed ou object tag pour lire le flux multimédia de la réponse?

Voici mon code dans le servlet:

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    request.getParameter("location"); 
    uploadFile(response); 
} 

private void uploadFile(HttpServletResponse response) { 
    File transferFile = new File("C:/TEMP/captured.mov"); 
    FileInputStream in = null; 

    try { 
     in = new FileInputStream(transferFile); 
    } catch (FileNotFoundException e) { 
     System.out.println("File not found"); 
    } 

    try { 
     System.out.println("in byes i s" + in.available()); 
    } catch (IOException e) { 
    } 

    DataOutputStream responseStream = null; 

    try { 
     responseStream = new DataOutputStream(response.getOutputStream()); 
    } catch (IOException e) { 
     System.out.println("Io exception"); 
    } 

    try { 
     Util.copyStream(in, responseStream); 
    } catch (CopyStreamException e) { 
     System.out.println("copy Stream exception"); 
    } 

    try { 
     responseStream.flush(); 
    } catch (IOException e) { 
    } 

    try { 
     responseStream.close(); 
    } catch (IOException e) { 
    } 
} 

Et voici la page html comme Ryan suggéré:

<embed SRC="http://localhost:7101/movies/transferservlet" 
    WIDTH=100 HEIGHT=196 AUTOPLAY=true CONTROLLER=true LOOP=false 
    PLUGINSPAGE="http://www.apple.com/quicktime/"> 

Toutes les idées?

Répondre

3

Pour commencer, il tire une demande GET, mais le servlet écoute sur POST demandes seulement. Vous devez effectuer cette tâche dans la méthode doGet() au lieu de doPost().

Vous devez également indiquer au navigateur Web quelles informations vous envoyez exactement. Cela doit être fait avec l'en-tête HTTP Content-Type. Vous pouvez trouver here un aperçu des types de contenu les plus utilisés (types MIME). Vous pouvez utiliser HttpServletResponse#setContentType() pour le définir. Dans le cas des fichiers Quicktime .mov, le type de contenu doit être video/quicktime.

response.setContentType("video/quicktime"); 

En outre, tous les formats de médias a sa propre façon d'être intégré à l'aide du <embed> et/ou l'élément <object>. Vous devez consulter la documentation du fournisseur de format de média pour savoir comment l'utiliser. Dans le cas des fichiers Quicktime .mov, vous devez consulter le Apple. Lisez attentivement ce document. Il est bien écrit et il gère aussi les inconscientes de crossbrowser. Vous préférerez probablement Do It the Easy Way avec l'aide d'un JavaScript simple pour combler les incompatibilités des navigateurs croisés de manière transparente.

<script src="AC_QuickTime.js" language="javascript"> </script> 
<script language="javascript"> 
    QT_WriteOBJECT('movies/filename.mov' , '320', '240' , ''); 
</script> 

Cela dit, le code de servlet est affiché honnêtement dit mauvais écrit. Mis à part le doPost() utilisé incorrectement, la gestion des ressources d'E/S est incorrecte, chaque ligne a son propre try/catch, les exceptions ont été supprimées et les mauvaises informations sont écrites sur stdout, InputStream#available() a été mal compris, le DataOutputStream a été utilisé sans raison claire , le InputStream n'est jamais fermé, etc. Non, ce n'est certainement pas le chemin. Veuillez consulter les didacticiels basic Java IO et basic Java Exception pour en savoir plus sur leur utilisation correcte.Voici une légère réécriture comment le servlet devrait ressembler à:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    String filename = URLDecoder.decode(request.getPathInfo(), "UTF-8"); 
    File file = new File("/path/to/all/movies", filename); 

    response.setHeader("Content-Type", "video/quicktime"); 
    response.setHeader("Content-Length", file.length()); 
    response.setHeader("Content-Disposition", "inline; filename=\"" + file.getName() + "\""); 

    BufferedInputStream input = null; 
    BufferedOutputStream output = null; 

    try { 
     input = new BufferedInputStream(new FileInputStream(file)); 
     output = new BufferedOutputStream(response.getOutputStream()); 

     byte[] buffer = new byte[8192]; 
     for (int length = 0; (length = input.read(buffer)) > 0;) { 
      output.write(buffer, 0, length); 
     } 
    } finally { 
     if (output != null) try { output.close(); } catch (IOException logOrIgnore) {} 
     if (input != null) try { input.close(); } catch (IOException logOrIgnore) {} 
    } 
} 

Carte en web.xml comme suit:

<servlet> 
    <servlet-name>movieServlet</servlet-name> 
    <servlet-class>com.example.MovieServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>movieServlet</servlet-name> 
    <url-pattern>/movies/*</url-pattern>   
</servlet-mapping> 

L'exemple aforeposted JavaScript montre exactement comment vous devriez l'utiliser. Il suffit d'utiliser le chemin /movies et d'ajouter le nom de fichier par la suite comme si /movies/filename.mov. Le request.getPathInfo() renverra /filename.mov.

+0

Salut Balus. Merci beaucoup pour votre retour. Mon codage est toujours faible :) Je définis le ContentType sur video/quicktime et cela fonctionne. Génial. Il y a beaucoup à apprendre de vous les gars. Je vais essayer votre exemple. –

+0

Combien d'utilisateurs attendez-vous que cette servlet réponde simultanément? Etes-vous sûr que les E/S que vous avez avec la création de FileInputstream fonctionneront pour plus de quelques requêtes simultanées? –

+0

Je dois avouer que je suis nouveau et amarteur à cela. Avez-vous un bon document sur la concurrence simultanée? –

1
<EMBED SRC="<your servlet hosting the movie>" WIDTH=100 HEIGHT = 196 AUTOPLAY=true CONTROLLER=true LOOP=false PLUGINSPAGE=http://www.apple.com/quicktime/"> 
+0

Bonjour Ryan, merci pour votre aide. Mais quand je l'essaye, il y a un rapport d'erreur indiquant qu'il n'y a pas de plug-in disponible pour le plugin application/octet-stream. ?? –

+0

HI Ryan, j'ai essayé mais le navigateur a signalé l'absence du plugin pour application/octet-stream ?? –

+0

essayez de définir response.setContentType ("video/quicktime") dans votre servlet juste avant d'obtenir le flux de sortie .. et un mot d'avertissement .. en regardant votre code, je ne pense pas que cette approche va évoluer pour plus de quelques utilisateurs simultanés . –