2017-07-25 6 views
0

J'écris le classeur Excel créé à l'aide Apache POI à l'objet de réponse directement comme suit sans créer un fichier:Télécharger Excel xlsx au lieu de format zip dans Scalatra

val outputStream: ByteArrayOutputStream = new ByteArrayOutputStream() 
workbook.write(outputStream) 
ExcelOk(response.getOutputStream.write(outputStream.toByteArray)) 

Mais une fois que la taille de la la réponse dépasse 8 Ko, il commence à être téléchargé en tant que fichier zip dans Chrome et octet-stream dans FireFox.

Mon objet ExcelOk ressemble à ceci:

object ExcelOk { 
    def apply(body: Any = Unit, headers: Map[String, String] = ExcelContentType, reason: String = "") = { 
    halt(ActionResult(responseStatus(200, reason), body, headers)) 
    } 
} 

et mon ExcelContentType (c.-à-têtes de réponse) est comme ci-dessous:

val ExcelContentType = Map(
    "Access-Control-Allow-Credentials" -> "true", 
    "Access-Control-Allow-Methods" -> "GET, PUT, POST, DELETE, OPTIONS", 
    "Access-Control-Allow-Origin" -> "*", 
    "Access-Control-Max-Age" -> "1728000", 
    "Content-type" -> "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", 
    "Content-disposition" -> "attachment; filename=excel_report.xlsx" 
) 

J'ai même essayé d'ajouter "Transfer-Encoding" -> "chunked" à la liste d'en-tête mais ne fonctionne pas.

J'ajouté cet extrait dans mon dossier web.xml aussi bien mais il n'a pas aidé non plus:

<mime-mapping> 
    <extension>xlsx</extension> 
    <mime-type>application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</mime-type> 
</mime-mapping> 

Toute aide concernant ce serait utile. Notez que ce comportement est observé uniquement lorsque la taille de la réponse dépasse un certain seuil.

Répondre

1

Vous devez définir des en-têtes de réponse avant d'écrire le contenu dans le flux de sortie de réponse.

response.setHeader("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") 
response.setHeader("Content-disposition", "attachment; filename=excel_report.xlsx") 

workbook.write(response.getOutputStream)