Java GWT cannot open downloaded xlsx file - java

I'm new to GWT and in my company i was asked to make some changes in one of our applications.
Currently the Program generates reports in .xls format. Now we want to change it to .xlsx
public class Download extends HttpServlet {
private static final long serialVersionUID = 5580666921970339383L;
#Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
#Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String filename = (String)request.getSession().getAttribute(CrossReportConstants.ATTR_FILENAME);
byte[] data = (byte[])request.getSession().getAttribute(CrossReportConstants.ATTR_REPORT);
request.getSession().setAttribute(CrossReportConstants.ATTR_FILENAME, null);
request.getSession().setAttribute(CrossReportConstants.ATTR_REPORT, null);
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename=" + filename);
response.setHeader("Pragma", "no-cache");
response.setHeader("Expires", "0");
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setContentLength(data.length);
try {
InputStream in = new ByteArrayInputStream(data);
ServletOutputStream out = response.getOutputStream();
byte[] outputByte = new byte[4096];
// copy binary contect to output stream
while (in.read(outputByte, 0, 4096) != -1) {
out.write(outputByte, 0, 4096);
}
in.close();
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
I changed response.setContentType("application/vnd.ms-excel"); to
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
and I changed the filename to exampleReport.xlsx
When i test the Application i can download the report but i cannot open it - Excel tells me the file is corrupted. (the file has the right size and when i open it in a text editor i can see the content)
Did I miss something?
Thanks in advance

Related

Display Pdf file in browser using Servlet

I am using intellij Idea and I have saved my pdf file in resources folder. I want to display that pdf file in browser.
public class GetDocumentation extends HttpServlet {
private static final Logger log = Logger.getLogger(GetDocumentation.class);
#Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream pdf_path = this.getClass().getResourceAsStream(ApplicationProperties.getProperty("PDF_PATH"));
resp.setContentType("application/pdf");
resp.addHeader("Content-Disposition", "attachment; filename=Documentation.pdf");
OutputStream responseOutputStream = resp.getOutputStream();
byte[] buf = new byte[4096];
int len = -1;
while ((len = pdf_path.read(buf)) != -1) {
responseOutputStream.write(buf, 0, len);
}
responseOutputStream.flush();
responseOutputStream.close();
}
}
Documentation
I am using Jsp servlet and I am calling "/documentation". And my file is getting rendered but it's blank. Am I doing anything wrong?
inline Content-Disposition should be used to display the document. Replace "attachment" with "inline":
resp.addHeader("Content-Disposition", "inline; filename=Documentation.pdf");

How to convert byte[] to PDF in java servlet?

I am trying to create a PDF file out of a byte array. Before writing the bytes to the file I print them as a string and the contents get printed correctly but when I open the automatically downloaded PDF file, it won't open as the file is somehow damaged.
#Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
long logFileId = Long.valueOf(request.getParameter(REQUEST_PARAM_DOCUMENT_ID));
MappingInfo mapping = documentService.getMapping(logFileId);
byte[] file = mapping.getImportLogs();
System.out.println(new String(file));
response.setContentType("application/pdf");
response.setContentLength(file.length);
// response.reset();
response.setContentType("application/pdf");
String headerKey = "Content-Disposition";
String headerValue = String.format("attachment; filename=ImportLog.pdf");
response.setHeader(headerKey, headerValue);
OutputStream outStream = response.getOutputStream();
outStream.write(file);
outStream.flush();
outStream.close();
}
Can someone please point out the mistake I am making here? I am also trying not to use any third party APIs.
Thanks
You can check this example from JavaPoint.
http://www.javatpoint.com/how-to-write-data-into-PDF-using-servlet
I am not sure that we must use a third party API for this. I am able to achieve this using iText API. Might help someone else.
#Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
long logFileId = Long.valueOf(request.getParameter(REQUEST_PARAM_DOCUMENT_ID));
MappingInfo mapping = documentService.getMapping(logFileId);
byte[] file = mapping.getImportLogs();
OutputStream outStream = response.getOutputStream();
Document document = new Document();
try {
PdfWriter.getInstance(document, outStream);
document.open();
document.add(new Paragraph(new String(file)));
document.add(Chunk.NEWLINE);
document.add(new Paragraph("a paragraph"));
} catch (DocumentException e) {
e.printStackTrace();
}
document.close();
response.setContentLength(file.length);
response.setContentType("application/pdf");
String headerKey = "Content-Disposition";
String headerValue = String.format("attachment; filename=ImportLog.pdf");
response.setHeader(headerKey, headerValue);
outStream.write(file);
outStream.flush();
outStream.close();
}

Application does not generate report on a server

I have a JasperReports report generated via a Java web application. The application located at my localhost page: 8084/app/pages.jsp (where is the form that is sending to the servlet) generates the report perfectly, the problem occurred that when I generate the report served my site.com / app / pages.jsp got this result, it seems that the server does not interpret the file. pdf or her generation.
is a linux server running apache
This comes from an old project, you addresponse.setContentType("application/pdf"); and write as output the bytes of the file..
public class ReportSintesiServlet extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("application/pdf");
Lookup<IReportGeneration> l = new Lookup<IReportGeneration>(true, IReportGeneration.class);
IReportGeneration g = null;
try {
g = l.lookup();
} catch (Exception ex) {
return;
}
if (g != null) {
String param = request.getParameter("idc");
System.out.println("genero il report per idc " + param);
Integer idc = Integer.parseInt(param);
byte[] doc = (byte[]) g.generaSintesiAccordoIniziale(idc);
if (doc != null) {
FilePathManager fpm = new FilePathManager();
String pathtofile = fpm.pathToNuovaSintesi(idc);
File temp = new File(pathtofile);
FileUtil.writeBytesToFile(temp, doc);
response.addHeader("Content-Disposition", "attachment; filename=" + temp.getName());
response.setContentLength((int) temp.length());
FileInputStream fileInputStream = new FileInputStream(temp);
OutputStream responseOutputStream = response.getOutputStream();
int bytes;
while ((bytes = fileInputStream.read()) != -1) {
responseOutputStream.write(bytes);
}
}
}
}
#Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
#Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
#Override
public String getServletInfo() {
return "Short description";
}
}
PS: I removed some pieces of code which was not helpful in this case, as you can see you miss all the part of the logic for error management.

MSWord File download issue using HttpServlet

i have implemented a servlet to download doc files available under my application classpath.
what happening is; file is downloading but ms-word is unable to open it property.
see the screenshot of ms-word:
Servlet implementation is as follows:
public class DownloadFileServlet extends HttpServlet {
protected void doGet(
HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String fileName = "test.doc";
ClassPathResource resource = new ClassPathResource(File.separator + fileName);
ServletOutputStream sos = null;
FileInputStream fis = null;
try {
response.setContentType("application/msword");
response.setHeader("Content-disposition", "attachment; fileName=\"" + fileName + "\"" );
fis = new FileInputStream(new File(resource.getURI().getPath()));
byte[] bytes = org.apache.commons.io.IOUtils.toByteArray(fis);
sos = response.getOutputStream();
sos.write(bytes);
sos.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
if( fis != null) {
fis.close();
}
if( sos != null) {
sos.close();
}
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
i have tried almost all suggested Content Types for ms-word files. but still it is not working.
application/msword
application/ms-word
application/vnd.ms-word
Kindly suggest I'm making a mistake or is there any other way to achieve.
Note: i have tried almost all approaches available on SO.
Instead of reading, converting to byte[] simply write directly to the OutputStream. You shouldn't close the OutputStream as that is being handled by the container for you.
I would rewrite your servlet method to more or less the following (also why is it a servlet and not a (#)Controller?
protected void doGet(
HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String fileName = "test.doc";
ClassPathResource resource = new ClassPathResource(File.separator + fileName);
InputStream input = resource.getInputStream();
try {
response.setContentType("application/msword");
response.setHeader("Content-disposition", "attachment; fileName=\"" + fileName + "\"" );
org.springframework.util.StreamUtils.copy(input, response.getOutputStream());
} catch (Exception e) {
e.printStackTrace();
} finally {
if (input != null) {
try {
input.close();
} catch (IOEXception ie) {}
}
}
}
i do not know what a ClassPathResource class does. hence modified the code a bit.
ClassLoader clsLoader = Thread.currentThread().getContextClassLoader();
InputStream is = clsLoader.getResourceAsStream("test.doc");
and in the try block use:
byte[] bytes = org.apache.commons.io.IOUtils.toByteArray(is);
this should work fine. i placed the doc in the classpath. modify it to suit your needs.
Regarding the mime mapping, open your server properties and you will find a list of mime mapping. Eg. in eclipse for tomcat, just double click on the server and you should be able to find the mime mapping list there. application/msword worked fine

Why does my browser receive no data when OutputStream.flush() is called?

I have a servlet which just read a file and send it to the browser.
The file is readen correctly, but on OutputStream.flush(), the browser receive no data.
Firefox says :
"Corrupted Content Error
The page you are trying to view cannot be shown because an error in the data transmission was detected.". Firebug shows the status "Aborted".
IE open or save an empty file.
I tried little or big files.
The code is :
/**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* #param request servlet request
* #param response servlet response
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Use a ServletOutputStream because we may pass binary information
response.reset();
OutputStream out = response.getOutputStream();
// Get the file to view
String file = request.getParameter("path");
// Get and set the type and size of the file
String contentType = getServletContext().getMimeType(file);
response.setContentType(contentType);
long fileSize = (new File(file)).length();
response.setHeader("Content-Length:", "" + fileSize);
File f = new File(file);
response.setHeader("Content-Disposition", "attachment;filename="+f.getName());
response.setContentLength((int) fileSize);
// Return the file
try {
returnFile(file, out, response);
} catch (Exception e) {
Logger.getLogger(AffichageItemsServlet.class).error("", e);
} finally {
out.close();
}
}
// Send the contents of the file to the output stream
public static void returnFile(String filename, OutputStream out, HttpServletResponse resp)
throws FileNotFoundException, IOException {
FileInputStream fis = null;
try {
fis = new FileInputStream(filename);
byte[] buff = new byte[8* 1024];
int nbRead = 0;
while ((nbRead = fis.read(buff, 0, buff.length)) !=-1) {
out.write(buff, 0, nbRead);
}
out.flush();
} finally {
if (fis != null) {
fis.close();
}
}
}
The response is sent on "out.flush".
Any idea ?
For one thing, remove this line (you call setContentLength() below that):
response.setHeader("Content-Length:", "" + fileSize);
Also, you might try moving the getOutputStream() call to just before you start using the stream.

Categories

Resources