Comment définir un en-tête de réponse dans JAX-RS pour que l’utilisateur puisse voir le popup de téléchargement pour Excel?

J’ai écrit du code qui génère un fichier Excel à l’aide de REST JAX-RS et j’ai confirmé que le fichier Excel généré se trouvait dans le répertoire du serveur GlassFish.

Mais mon but est que lorsque l’utilisateur clique sur le bouton (qui génère Excel .xls), je souhaite que le popup de téléchargement demande à l’utilisateur s’il doit enregistrer ou ouvrir le fichier .xls comme n’importe quel autre service Web pour télécharger n’importe quel type de fichier.

Selon ma recherche, la démarche est la suivante:

  1. générer Excel .xls (DONE)

  2. écrire l’excel pour diffuser

  3. dans le fichier JAX-RS, définissez l’en-tête de la réponse sur quelque chose comme:

    Ssortingng fileName = “Blah_Report.xls”; response.setHeader (“Content-Disposition”, “pièce jointe; filename =” + fileName);

Ma question est que je fais tout cela dans un fichier JAX-RS et que l’object HttpServletResponse n’est pas disponible.

Selon la réponse de Add Response Header à JAX-RS Webservice

Il dit:

Vous pouvez injecter une référence à HttpServletResponse via l’annotation @Context dans votre service Web et utiliser addHeader () etc. pour append votre en-tête.

Je ne peux pas vraiment savoir ce que cela signifie exactement sans code exemple.

Vous n’avez pas besoin de HttpServletResponse pour définir un en-tête sur la réponse. Vous pouvez le faire en utilisant javax.ws.rs.core.Response. Faites simplement en sorte que votre méthode retourne une réponse au lieu d’une entité:

return Response.ok(entity).header("Content-Disposition", "attachment; filename=\"" + fileName + "\"").build() 

Si vous souhaitez toujours utiliser HttpServletResponse, vous pouvez l’injecter soit dans l’un des champs de la classe, soit en utilisant property, soit dans le paramètre method:

 @Path("/resource") class MyResource { // one way to get HttpServletResponse @Context private HttpServletResponse anotherServletResponse; // another way Response myMethod(@Context HttpServletResponse servletResponse) { // ... code } } 
 @Context ServletContext ctx; @Context private HttpServletResponse response; @GET @Produces(MediaType.APPLICATION_OCTET_STREAM) @Path("/download/{filename}") public StreamingOutput download(@PathParam("filename") Ssortingng fileName) throws Exception { final File file = new File(ctx.getInitParameter("file_save_directory") + "/", fileName); response.setHeader("Content-Length", Ssortingng.valueOf(file.length())); response.setHeader("Content-Disposition", "attachment; filename=\""+ file.getName() + "\""); return new StreamingOutput() { @Override public void write(OutputStream output) throws IOException, WebApplicationException { Utils.writeBuffer(new BufferedInputStream(new FileInputStream(file)), new BufferedOutputStream(output)); } }; } 

J’ai pensé à définir l’en-tête et le stream de réponse HTTP pour qu’ils affichent le popup de téléchargement dans le navigateur via le servlet standard. note: j’utilise Excella, excel output API.

 package local.test.servlet; import java.io.IOException; import java.net.URL; import java.net.URLDecoder; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import local.test.jaxrs.ExcellaTestResource; import org.apache.poi.ss.usermodel.Workbook; import org.bbreak.excella.core.BookData; import org.bbreak.excella.core.exception.ExportException; import org.bbreak.excella.reports.exporter.ExcelExporter; import org.bbreak.excella.reports.exporter.ReportBookExporter; import org.bbreak.excella.reports.model.ConvertConfiguration; import org.bbreak.excella.reports.model.ReportBook; import org.bbreak.excella.reports.model.ReportSheet; import org.bbreak.excella.reports.processor.ReportProcessor; @WebServlet(name="ExcelServlet", urlPatterns={"/ExcelServlet"}) public class ExcelServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { URL templateFileUrl = ExcellaTestResource.class.getResource("myTemplate.xls"); // /C:/Users/m-hugohugo/Documents/NetBeansProjects/KogaAlpha/build/web/WEB-INF/classes/local/test/jaxrs/myTemplate.xls System.out.println(templateFileUrl.getPath()); Ssortingng templateFilePath = URLDecoder.decode(templateFileUrl.getPath(), "UTF-8"); Ssortingng outputFileDir = "MasatoExcelHorizontalOutput"; ReportProcessor reportProcessor = new ReportProcessor(); ReportBook outputBook = new ReportBook(templateFilePath, outputFileDir, ExcelExporter.FORMAT_TYPE); ReportSheet outputSheet = new ReportSheet("MySheet"); outputBook.addReportSheet(outputSheet); reportProcessor.addReportBookExporter(new OutputStreamExporter(response)); System.out.println("wtf???"); reportProcessor.process(outputBook); System.out.println("done!!"); } catch(Exception e) { System.out.println(e); } } //end doGet() @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }//end class class OutputStreamExporter extends ReportBookExporter { private HttpServletResponse response; public OutputStreamExporter(HttpServletResponse response) { this.response = response; } @Override public Ssortingng getExtention() { return null; } @Override public Ssortingng getFormatType() { return ExcelExporter.FORMAT_TYPE; } @Override public void output(Workbook book, BookData bookdata, ConvertConfiguration configuration) throws ExportException { System.out.println(book.getFirstVisibleTab()); System.out.println(book.getSheetName(0)); //TODO write to stream try { response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-Disposition", "attachment; filename=masatoExample.xls"); book.write(response.getOutputStream()); response.getOutputStream().close(); System.out.println("booya!!"); } catch(Exception e) { System.out.println(e); } } }//end class