Java Spring - généré dynamiquement fichier csv télécharger la réponse est suspendu

Sur mon site de l'entreprise, nous avons quelques tables dont nous avons besoin pour exporter vers un fichier csv.
Il y a quelques varier les paramètres, de sorte que le fichier csv doit être créé dynamiquement à la demande.

Mon problème est que après avoir cliqué sur télécharger, la réponse se bloque, et attendre pour l'ensemble du fichier à créer (ce qui peut prendre un certain temps), et seulement ensuite télécharge le fichier entier en un instant.

Je suis en utilisant AngularJS, donc je suis en utilisant window.location = <url_for_file_download> afin de rendre le navigateur à télécharger le fichier.

Sur le côté serveur, je suis en utilisant Java Spring et j'ai suivi toutes les instructions que j'ai pu trouver sur le web dans le but de créer un fichier de téléchargement contrôleur.

Mon code de contrôleur est quelque chose comme ceci:

@RequestMapping(value = "http://yada.yada.yada/csv/myFile.csv", method = RequestMethod.GET)
public @ResponseBody
void getCustomers(HttpServletResponse response,
                         @RequestParam(required = false) String someParameters) 
                         throws NotAuthorizedException, IOException {  
//set headers
setHeaders(response);
//generate writer
CSVWriter write = generateWriter(response);
//get data
List<String[]> data = getData();
//write and flush and all that
.
.
.
}

Mon code pour le réglage des en-têtes de réponse sont:

response.setContentType("text/csv;charset=utf-8");
response.setHeader("Content-Disposition","attachment; filename=\"" + fileName + ".csv\"");

J'ai aussi essayé d'ajouter les en-têtes suivants:

response.setHeader("Transfer-Encoding", "Chunked");
response.setHeader("Content-Description", "File Transfer");

et j'ai aussi essayé le réglage du type de Contenu pour "application/octet-stream".

Avis que je ne suis pas d'ajouter un Content-length - tête, car le fichier n'existe pas encore, et est en cours d'écriture à la volée.

Pour écrire le fichier csv que je suis en utilisant OpenCSV et mon code est comme suit:

OutputStream resOs = response.getOutputStream();
OutputStream buffOs = new BufferedOutputStream(resOs);
OutputStreamWriter outputWriter = new OutputStreamWriter(buffOs,"UTF-8");
CSVWriter writer = new CSVWriter(outputWriter);

Je itérer sur les données et l'écrire comme ceci:

for (String[] row: data) {
    writer.writeNext(line);
}

(Ce n'est pas exactement le code, mais c'est plus ou d'autre ce qui se passe dans le code)

Et à la fin je tire la chasse et de la proximité:

writer.flush();
writer.close();

J'ai aussi essayé de rinçage après chaque ligne que j'écris.

Alors pourquoi n'est-ce pas le fichier en cours de transfert avant qu'il a été écrit?
Pourquoi mon navigateur (Google chrome) en téléchargeant le fichier dans un instant, après une longue attente? Et comment je peux résoudre ce problème.

J'espère que j'ai ajouté assez de code, si il manque quelque chose, juste s'il vous plaît dites-moi et je vais essayer de l'ajouter ici.

Je vous remercie beaucoup à l'avance.

est le code qui définit la réponse et écrit à la responseoutput flux dans le contrôleur?
Oui, désolé si ce n'était pas clair. Mais je ne l'utilisation de certains aidant fonctions, que je passe l'objet httpServletResponse, afin de définir les en-têtes et de créer de l'écrivain. Je vais modifier la question.
avez-vous trouvé la solution pour ce problème? Je vais avoir le même.
Non, désolé, je n'ai pas.
vérifier si ma réponse est utile.

OriginalL'auteur jonny bordo | 2015-02-23