Fichier Zip téléchargé sans.extension zip dans Chrome via Java


  1. J'essaie de télécharger un fichier zip à partir d'un emplacement fixe présent dans le serveur.
  2. Dans ma méthode Rest , je passe simplement le nom de fichier du client (navigateur) . (Voir code ci-dessous ).
  3. Dans ma méthode Rest, j'envoie le fichier zip au client.

  4. Le fichier est téléchargé sur le navigateur sans aucun problème.

Mon Problème est que le fichier est téléchargé sur navigateur sans .extension zip.

@RequestMapping(value = "/zip/{filePath}", method = RequestMethod.GET)
public @ResponseBody void downloadZip(@PathVariable("filePath") String filePath, HttpServletRequest request, HttpServletResponse response) throws IOException {

  ServletContext context = request.getServletContext();
  File downloadFile = new File(filePath);
  FileInputStream inputStream = new FileInputStream(downloadFile);
  // get output stream of the response
  OutputStream outStream = response.getOutputStream();

  byte[] buffer = new byte[(int) downloadFile.length()];
  int bytesRead = -1;

  // write bytes read from the input stream into the output stream
  while ((bytesRead = inputStream.read(buffer)) != -1) {
    outStream.write(buffer, 0, bytesRead);
  }
  // get MIME type of the file
  String mimeType = context.getMimeType(fullPath);
  if (mimeType == null) {
    // set to binary type if MIME mapping not found
    mimeType = "application/octet-stream";
  }
  System.out.println("MIME type: " + mimeType);

  // set content attributes for the response
  response.setContentType(mimeType);
  response.setContentLength((int) downloadFile.length());

  response.setHeader("Content-Disposition",
      String.format("attachment; filename=\"%s\"", downloadFile.getName()));
  logger.error("Filename = " + downloadFile.getName());
  inputStream.close();
  outStream.close();
}

PS: Le fichier obtient téléchargé sur une machine avec ZIP et dans une machine sans ZIP. J'ai testé uniquement sur Chrome (selon les exigences du client). Je pense qu'il y a un problème avec les paramètres Chrome que je dois regarder (juste une supposition).

Quelqu'un Peut-il aider à cela?

Merci d'avance....

Author: krohit, 2016-09-29

1 answers

Changez l'ordre entre la définition des en - têtes de réponse et le fait de pousser le fichier dans le flux de sortie-après tout, les en-têtes doivent partir en premier.

[Édité]

  1. " Pourquoi la définition de HttpServletResponse dans le démarrage affecte le code."
    Eh bien, simple: le client est censé recevoir des instructions sur ce qu'il faut faire avec la charge utile en interprétant les en-têtes de réponse HTTP. Si ceux-ci ne sont pas définis au début, envoyer ces en-têtes à la fin de la transmission vient trop tard. Et cela suppose que HttpServletResponse enverra réellement ces en - têtes lorsqu'il est invoqué avec setHeader, ce qui est une grande hypothèse - je soupçonne que ces en-têtes ne seront pas réellement envoyés après appelant response.getOutputStream - il est peu probable que la réponse tamponne toute la charge utile pour attendre que l'appelant spécifie ces en-têtes.
 1
Author: Adrian Colomitchi, 2016-10-01 00:29:46