Jak ustawić nagłówek odpowiedzi w JAX-RS, aby użytkownik widział wyskakujące okienko pobierania dla programu Excel?

Napisałem kod, który generuje plik Excela za pomocą REST JAX - RS i potwierdziłem, że wygenerowany plik Excela znajduje się w katalogu serwera GlassFish.

Ale moim celem jest, gdy użytkownik kliknie na przycisk (który generuje Excela .xls), Chcę pobrać popup, aby pokazać się z pytaniem użytkownika, czy zapisać lub otworzyć .plik xls podobnie jak inne usługi internetowe do pobierania plików dowolnego typu.

Według moich poszukiwań, krok jest:

  1. Generuj Excela .xls (DONE)

  2. Zapisz excel do strumienia

  3. W pliku JAX-RS Ustaw nagłówek odpowiedzi na coś w rodzaju

    String fileName = " Blah_Report.xls"; odpowiedź.setHeader ("Content-Disposition", "attachment; filename=" + fileName);

Moje pytanie brzmi: robię to wszystko w pliku JAX-RS i nie mam dostępnego obiektu HttpServletResponse.

Zgodnie z odpowiedzią z Dodaj nagłówek odpowiedzi do JAX-RS Webservice

On says:

Można wprowadzić odniesienie do rzeczywisty HttpServletResponse poprzez @ Adnotacja kontekstowa w usłudze webservice i użyj addHeader () itd. aby dodać swój nagłówek.

Nie mogę zrozumieć, co to dokładnie oznacza bez przykładowego kodu..

Author: Community, 2011-01-07

3 answers

Nie potrzebujesz HttpServletResponse, aby ustawić nagłówek odpowiedzi. Możesz to zrobić za pomocą javax. ws. rs. core. Response. wystarczy, że twoja metoda zwróci odpowiedź zamiast encji:

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

Jeśli nadal chcesz używać HttpServletResponse, możesz go wstrzyknąć do jednego z pól klasy lub użyć właściwości lub parametru metody:

@Path("/resource")
class MyResource {

  // one way to get HttpServletResponse
  @Context
  private HttpServletResponse anotherServletResponse;

  // another way
  Response myMethod(@Context HttpServletResponse servletResponse) {
      // ... code
  }
}
 79
Author: Tarlog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-28 17:49:48
@Context ServletContext ctx;
@Context private HttpServletResponse response;

@GET
@Produces(MediaType.APPLICATION_OCTET_STREAM)
@Path("/download/{filename}")
public StreamingOutput download(@PathParam("filename") String fileName) throws Exception {
    final File file = new File(ctx.getInitParameter("file_save_directory") + "/", fileName);
    response.setHeader("Content-Length", String.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));
        }
    };
}
 15
Author: Jay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-19 13:03:45

Pomyślałem, aby ustawić nagłówek odpowiedzi HTTP i strumień, aby wyświetlał popup w przeglądarce za pomocą standardowego servletu. Uwaga: używam 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());
            String templateFilePath = URLDecoder.decode(templateFileUrl.getPath(), "UTF-8");
            String 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 String getExtention() {
        return null;
    }

    @Override
    public String 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
 0
Author: masato-san,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-01 01:41:06