Note that there are some explanatory texts on larger screens.

plurals
  1. POWhy it throws Write Failed exceptions on my FileServlet
    primarykey
    data
    text
    <p>I have a web instance which gives downloads with dynamic names by using a file servlet. My current file name is A.apk, I can give the download as A_username.apk. Everything is OK up to now. However, It always throws exceptions even the file download process is successed.</p> <p>My code :</p> <pre><code>public class FileServlet extends HttpServlet { private static final int DEFAULT_BUFFER_SIZE = 10240; // 10KB. private String filePath; public void init() throws ServletException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) { String tag = "" + request.getParameter("tag"); String name = "MyApp"; try { String requestedFile = request.getPathInfo(); this.filePath = "C:/WEBROOT/Test/build/web/andrapp"; // Check if file is actually supplied to the request URI. if (requestedFile == null) { // Do your thing if the file is not supplied to the request URI. // Throw an exception, or send 404, or show default/warning page, or just ignore it. response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404. return; } // Decode the file name (might contain spaces and on) and prepare file object. File file = new File(filePath, URLDecoder.decode(requestedFile, "UTF-8")); // Check if file actually exists in filesystem. if (!file.exists()) { // Do your thing if the file appears to be non-existing. // Throw an exception, or send 404, or show default/warning page, or just ignore it. response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404. return; } // Get content type by filename. String contentType = getServletContext().getMimeType(file.getName()); // If content type is unknown, then set the default value. // For all content types, see: http://www.w3schools.com/media/media_mimeref.asp // To add new content types, add new mime-mapping entry in web.xml. if (contentType == null) { contentType = "application/octet-stream"; } // Init servlet response. response.reset(); response.setBufferSize(DEFAULT_BUFFER_SIZE); response.setContentType(contentType); response.setHeader("Content-Length", String.valueOf(file.length())); response.setHeader("Content-Disposition", "attachment; filename=\"" + name + ".apk" + "\""); // Prepare streams. BufferedInputStream input = null; BufferedOutputStream output = null; try { // Open streams. input = new BufferedInputStream(new FileInputStream(file), DEFAULT_BUFFER_SIZE); output = new BufferedOutputStream(response.getOutputStream(), DEFAULT_BUFFER_SIZE); // Write file contents to response. byte[] buffer = new byte[DEFAULT_BUFFER_SIZE]; int length; while ((length = input.read(buffer)) &gt; 0) { output.write(buffer, 0, length); } System.out.println("Download Success"); } finally { // Gently close streams. close(output); close(input); } } catch (Exception ex) { System.out.println("Download Cancelled"); ex.printStackTrace(); } } // Helpers (can be refactored to public utility class) ---------------------------------------- private static void close(Closeable resource) { if (resource != null) { try { resource.close(); } catch (IOException e) { // Do your thing with the exception. Print it, log it or mail it. e.printStackTrace(); } } } } </code></pre> <p>If the download is OK, it outputs "Download Success" and "Download Cancelled" both. If I cancel the download, it outputs only "Download Cancelled".</p> <p>The exception log :</p> <pre><code> CORE3282: stdout: Download Cancelled CORE3283: stderr: java.io.IOException: WEB8001: Write failed CORE3283: stderr: at com.iplanet.ias.web.connector.nsapi.NSAPIConnector.write(NSAPIConnector.java:789) CORE3283: stderr: at com.iplanet.ias.web.connector.nsapi.NSAPIResponseStream.write(NSAPIResponseStream.java:75) CORE3283: stderr: at org.apache.catalina.connector.ResponseBase.flushBuffer(ResponseBase.java:824) CORE3283: stderr: at org.apache.catalina.connector.HttpResponseBase.flushBuffer(HttpResponseBase.java:794) CORE3283: stderr: at com.iplanet.ias.web.connector.nsapi.NSAPIResponse.flushBuffer(NSAPIResponse.java:127) CORE3283: stderr: at org.apache.catalina.connector.ResponseBase.write(ResponseBase.java:788) CORE3283: stderr: at org.apache.catalina.connector.ResponseStream.write(ResponseStream.java:361) CORE3283: stderr: at java.io.BufferedOutputStream.write(BufferedOutputStream.java:122) CORE3283: stderr: at com.newwap.developer.tools.FileServlet.doGet(FileServlet.java:120) CORE3283: stderr: at javax.servlet.http.HttpServlet.service(HttpServlet.java:787) CORE3283: stderr: at javax.servlet.http.HttpServlet.service(HttpServlet.java:908) CORE3283: stderr: at org.apache.catalina.core.StandardWrapperValve.invokeServletService(StandardWrapperValve.java:771) CORE3283: stderr: at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:322) CORE3283: stderr: at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:509) CORE3283: stderr: at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:218) CORE3283: stderr: at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:509) CORE3283: stderr: at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:209) CORE3283: stderr: at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:509) CORE3283: stderr: at com.iplanet.ias.web.connector.nsapi.NSAPIProcessor.process(NSAPIProcessor.java:157) CORE3283: stderr: at com.iplanet.ias.web.WebContainer.service(WebContainer.java:579) CORE3282: stdout: Download Success </code></pre> <p>It indicates exaclty the line : output.write(buffer, 0, length);</p> <p>Any idea ?</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload