2011-09-14 3 views
2

J'utilise Spring avec DWR. Je souhaite renvoyer un objet fichier en guise de réponse, mais je sauvegarde le fichier (à envoyer) à l'emplacement temporaire du serveur puis j'envoie son emplacement en tant que href pour la balise d'ancrage côté client, mais je me demande s'il peut y avoir un fichier directement au navigateur sur l'objet de réponse sans l'enregistrer temporairement sur le serveur.comment écrire un objet fichier sur la réponse du serveur et sans enregistrer le fichier sur le serveur?

Je m'attendais à ce qu'il y ait un moyen d'envoyer un fichier en réponse via DWR.

Répondre

4
 
public ModelAndView writeFileContentInResponse(HttpServletRequest request, HttpServletResponse response) throws IOException { 

     FileInputStream inputStream = new FileInputStream("FileInputStreamDemo.java"); //read the file 

     response.setHeader("Content-Disposition","attachment; filename=test.txt"); 
     try { 
      int c; 
      while ((c = inputStream.read()) != -1) { 
      response.getWriter().write(c); 
      } 
     } finally { 
      if (inputStream != null) 
       inputStream.close(); 
       response.getWriter().close(); 
     } 

     } 
+0

Mais encore une fois nouveau FileInputStream ("FileInputStreamDemo.java"); a besoin d'un fichier enregistré .... pendant que je veux Ne pas créer un fichier n'importe où plutôt écrire simplement les données sur le flux de réponse. Pourrait-il être fait de toute façon? – Sankalp

+1

Si le contenu de votre réponse est dynamique (chaîne de caractères), placez le contenu dans ByteArrayInputStream, puis écrivez dans le bloc de réponse-> writer par le bloc – Pokuri

+0

nouveau FileInputStream ("FileInputStreamDemo.java "); est utilisé pour lire le fichier enregistré du serveur emplacement temporaire – Rupok

0

Cela fait des années que je n'ai pas utilisé Spring, et je ne suis pas familier avec DWR, mais l'essentiel de votre question est basique sur le web.

La réponse est oui, vous pouvez. En effet, vous devez définir l'en-tête HTTP Content-Disposition: attachment, puis rediffuser le contenu. Tout cela sera dans la réponse à la demande initiale (par opposition à renvoyer un lien).

Le code réel pour y parvenir dépendra de vos circonstances, mais cela devrait vous aider à démarrer.

+0

DWR est Remoting web directe, nous appelons simplement une méthode sur le serveur et la réponse est renvoyée à celle-ci, je m'attendais à ce qu'il y ait un moyen d'envoyer un fichier en guise de réponse. – Sankalp

0

vous appelez la méthode à partir de Java Script, non? Je n'ai pas vraiment compris comment Spring est lié à ce flux, mais autant que je sache, DWR vous permet de produire des scripts Java et d'appeler les méthodes Java du bean exposé directement sur le serveur à partir de votre code client Java.

Vous pouvez lire le fichier octet par octet et le renvoyer depuis votre méthode java tant qu'il renvoie réellement un tableau d'octets. Cependant, que feriez-vous avec ce tableau d'octets sur le client? Je pense juste dans ce flux spécifique que vous ne devriez pas utiliser le DWR mais plutôt émettre une requête AJAX ordinaire (si DWR peut envelopper d'une manière ou d'une autre pour plus de commodité - super). Cette requête ne doit pas parvenir à DWRServlet, mais doit plutôt être effectuée par une servlet régulière/un framework Web, comme Spring MVC :) Une fois la requête envoyée au servlet, utilisez

response.setHeader ("Content- Disposition "," attachment; filename = test.txt ");

comme cela a déjà été indiqué.

Espérons que cela aide, Bonne chance! Mark

+0

Absolument correct Mark, je l'appelle par js et le printemps est indépendant de celui-ci Et je cherche la solution pour lire des données du serveur et la réponse au client avec dire Excel fichier, sans le fichier d'enregistrement sur le serveur de toute façon.Et oui appel DWR pas nécessaire, même si je reçois une demande d'envoi AJAX ... fonctionnera bien.Solutn par vous dit "Vous pouvez lire le fichier byte by-byte et ... ", chère marque je ne veux pas écrire n'importe quel fichier sauf sur la réponse sans l'enregistrer – Sankalp

+1

Non, je pense que je pourrais juste exprimer clairement mon exallation :). Je voulais dire juste que si vous lisez le fichier sur le serveur dans la méthode du haricot exposé par DWR, par exemple: class MyBean {byte [] f() {return read ("fichier.txt"}} - cela enverra le fichier au côté du script java, mais là encore vous ne pouvez rien faire d'utile avec Pour moi, ce n'est pas une solution, c'est ce que j'essayais de dire. sans le DWR est un moyen d'aller ici. –

+1

Si vous ne voulez pas enregistrer le fichier sur le serveur, vous n'êtes pas obligé de le faire. Une fois que vous avez un flux d'octets en mémoire, vous pouvez l'envoyer au client et vous n'êtes pas obligé de le stocker sur le disque dur. L'astuce consiste à ne pas envoyer mais à envoyer le fichier directement. Quand le navigateur verra l'attachement, il ouvrira le programme pour gérer ce fichier/offre de le télécharger) De cette façon, le fichier n'est pas stocké sur le serveur ... –

-1

Un exemple qui retourne un excel pour télécharger du client:

// côté Java:

public FileTransfer getExcel(Parametros param){ 
    byte[] result = <here get data>; 
    InputStream myInputStream = new ByteArrayInputStream(result); 
    String excelFormat = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
    FileTransfer dwrExcelFile = new FileTransfer("excel.xlsx", excelFormat, myInputStream); 
    return dwrExcelFile; 
} 

// côté Javascript:

function downloadExcelFile() { 
    dwr.engine.setTimeout(59000); 
    var params = <params_to_send>; 
    <Java_class>.getExcel(params, {callback:function(dataFromServer) { 
    downloadExcelCallback(dataFromServer); 
    }}); 
} 

function downloadExcelCallback(data) { 
    dwr.engine.openInDownload(data); 
} 
Questions connexes