struts-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Zoran Avtarovski <zo...@sparecreative.com>
Subject Re: Stream Result Returns Empty File
Date Thu, 14 Nov 2013 00:14:20 GMT
Found the issue.

I hadn’t set the contentLength parameter.

In the latest update to 2.3.15 if the contentLength isn’t set it generates
a zero length stream.

Once I set contentLength to tempFile.length() it all worked again.

Z.



On 13/11/2013 3:34 pm, "Zoran Avtarovski" <zoran@sparecreative.com> wrote:

>I¹m seeing a really strange issue in one of our struts apps with a stream
>result where the downloaded file is empty (zero bytes).
>
>I can¹t see where it is going wrong. I dynamically generate a zip file in
>tomcat¹s temp folder and then use a Buffered input reader to pass off to
>the
>struts stream.
>
>I can the the zip file in the tomcat temp folder and it contains the data
>it¹s supposed to. The issue is getting from the file to the input stream.
>I¹ve included by struts configuration, the relevant part of my action and
>the a detailed log.
>
>I¹d appreciate any help.
>
>Z.
>
>
>My struts config :
>        <action name="exportData" class="clientAction"
>method="exportData">
>            <result name="success" type="stream">
>                <param name="allowCaching">false</param>
>                <param name="contentType">${documentContentType}</param>
>                <param
>name="contentDisposition">${documentFileName}</param>
>                <param
>name="contentLength">${documentContentLength}</param>
>                <param name="bufferSize">1024</param>
>            </result>
>        </action>
>
>In my action class :
>
>            String filePrefix = System.getProperty("java.io.tmpdir") +
>³/temporaryData.zip" ;
>   LOGGER.debug("Read the generated file : "+ zipName);
>            File tempFile = new File(zipName);
>            if(tempFile.exists()){
>                LOGGER.debug("The file exists : "+ zipName);
>            }
>            if(tempFile.canRead()){
>                LOGGER.debug("The file can be read : "+ zipName);
>            }
>            if(tempFile.isFile()){
>                LOGGER.debug("The file is a file : "+ zipName);
>            }
>            if(tempFile.isHidden()){
>                LOGGER.debug("The file is hidden : "+ zipName);
>            }
>            LOGGER.debug("The file size is : "+ tempFile.length());
>
>            inputStream = new BufferedInputStream(new
>FileInputStream(tempFile));
>            documentFileName = "attachment; filename=NfcData.zip";
>            documentContentType = "application/zip";
>
>
>My log files looks like this:
>
>DEBUG [http-bio-8084-exec-24] - Zip file name :
>/Users/zoran/Library/Application
>Support/NetBeans/7.4/apache-tomcat-7.0.41.0_base/temp/temporaryData.zip
>DEBUG [http-bio-8084-exec-24] - Read the generated file :
>/Users/zoran/Library/Application
>Support/NetBeans/7.4/apache-tomcat-7.0.41.0_base/temp/temporaryData.zip
>DEBUG [http-bio-8084-exec-24] - The file exists :
>/Users/zoran/Library/Application
>Support/NetBeans/7.4/apache-tomcat-7.0.41.0_base/temp/temporaryData.zip
>DEBUG [http-bio-8084-exec-24] - The file can be read :
>/Users/zoran/Library/Application
>Support/NetBeans/7.4/apache-tomcat-7.0.41.0_base/temp/temporaryData.zip
>DEBUG [http-bio-8084-exec-24] - The file is a file :
>/Users/zoran/Library/Application
>Support/NetBeans/7.4/apache-tomcat-7.0.41.0_base/temp/temporaryData.zip
>DEBUG [http-bio-8084-exec-24] - The file size is : 1441
>DEBUG [http-bio-8084-exec-24] - Document File name : attachment;
>filename=NfcData.zip
> Document Content Type : application/zip
>DEBUG [http-bio-8084-exec-24] - Returning cached instance of singleton
>bean
>'org.springframework.transaction.config.internalTransactionAdvisor'
>DEBUG [http-bio-8084-exec-24] - Retrieving convert for class [class
>org.apache.struts2.dispatcher.StreamResult] and property [allowCaching]
>DEBUG [http-bio-8084-exec-24] - Converter is null for property
>[allowCaching]. Mapping size [0]:
>DEBUG [http-bio-8084-exec-24] - field-level type converter for property
>[allowCaching] = none found
>DEBUG [http-bio-8084-exec-24] - global-level type converter for property
>[allowCaching] = 
>com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter@5b6e6482
>DEBUG [http-bio-8084-exec-24] - Retrieving convert for class [class
>org.apache.struts2.dispatcher.StreamResult] and property [bufferSize]
>DEBUG [http-bio-8084-exec-24] - field-level type converter for property
>[bufferSize] = none found
>DEBUG [http-bio-8084-exec-24] - global-level type converter for property
>[bufferSize] = 
>com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter@5b6e6482
>DEBUG [http-bio-8084-exec-24] - Creating converter of type
>[com.opensymphony.xwork2.conversion.impl.NumberConverter]
>DEBUG [http-bio-8084-exec-24] - Entering nullPropertyValue
>[target=[com.sparecreative.sms.gateway.action.ClientAction@988c0a6,
>com.opensymphony.xwork2.DefaultTextProvider@907a831],
>property=contentDisposition]
>DEBUG [http-bio-8084-exec-24] - Retrieving convert for class [class
>com.opensymphony.xwork2.util.CompoundRoot] and property [(null)]
>DEBUG [http-bio-8084-exec-24] - field-level type converter for property
>[null] = none found
>DEBUG [http-bio-8084-exec-24] - global-level type converter for property
>[null] = none found
>DEBUG [http-bio-8084-exec-24] - falling back to default type converter
>[com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter@5b6e6482]
>DEBUG [http-bio-8084-exec-24] - Entering nullPropertyValue
>[target=[com.sparecreative.sms.gateway.action.ClientAction@988c0a6,
>com.opensymphony.xwork2.DefaultTextProvider@907a831],
>property=contentType]
>DEBUG [http-bio-8084-exec-24] - Retrieving convert for class [class
>com.opensymphony.xwork2.util.CompoundRoot] and property [(null)]
>DEBUG [http-bio-8084-exec-24] - field-level type converter for property
>[null] = none found
>DEBUG [http-bio-8084-exec-24] - global-level type converter for property
>[null] = none found
>DEBUG [http-bio-8084-exec-24] - falling back to default type converter
>[com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter@5b6e6482]
>DEBUG [http-bio-8084-exec-24] - Entering nullPropertyValue
>[target=[com.sparecreative.sms.gateway.action.ClientAction@988c0a6,
>com.opensymphony.xwork2.DefaultTextProvider@907a831], property=inputName]
>DEBUG [http-bio-8084-exec-24] - Retrieving convert for class [class
>com.opensymphony.xwork2.util.CompoundRoot] and property [(null)]
>DEBUG [http-bio-8084-exec-24] - field-level type converter for property
>[null] = none found
>DEBUG [http-bio-8084-exec-24] - global-level type converter for property
>[null] = none found
>DEBUG [http-bio-8084-exec-24] - falling back to default type converter
>[com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter@5b6e6482]
>DEBUG [http-bio-8084-exec-24] - Entering nullPropertyValue
>[target=[com.sparecreative.sms.gateway.action.ClientAction@988c0a6,
>com.opensymphony.xwork2.DefaultTextProvider@907a831],
>property=contentLength]
>DEBUG [http-bio-8084-exec-24] - Retrieving convert for class [class
>com.opensymphony.xwork2.util.CompoundRoot] and property [(null)]
>DEBUG [http-bio-8084-exec-24] - field-level type converter for property
>[null] = none found
>DEBUG [http-bio-8084-exec-24] - global-level type converter for property
>[null] = none found
>DEBUG [http-bio-8084-exec-24] - falling back to default type converter
>[com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter@5b6e6482]
>DEBUG [http-bio-8084-exec-24] - Entering nullPropertyValue
>[target=[com.sparecreative.sms.gateway.action.ClientAction@988c0a6,
>com.opensymphony.xwork2.DefaultTextProvider@907a831], property=bufferSize]
>DEBUG [http-bio-8084-exec-24] - Retrieving convert for class [class
>com.opensymphony.xwork2.util.CompoundRoot] and property [(null)]
>DEBUG [http-bio-8084-exec-24] - field-level type converter for property
>[null] = none found
>DEBUG [http-bio-8084-exec-24] - global-level type converter for property
>[null] = none found
>DEBUG [http-bio-8084-exec-24] - falling back to default type converter
>[com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter@5b6e6482]
>DEBUG [http-bio-8084-exec-24] - Entering nullPropertyValue
>[target=[com.sparecreative.sms.gateway.action.ClientAction@988c0a6,
>com.opensymphony.xwork2.DefaultTextProvider@907a831],
>property=contentCharSet]
>DEBUG [http-bio-8084-exec-24] - Retrieving convert for class [class
>com.opensymphony.xwork2.util.CompoundRoot] and property [(null)]
>DEBUG [http-bio-8084-exec-24] - field-level type converter for property
>[null] = none found
>DEBUG [http-bio-8084-exec-24] - global-level type converter for property
>[null] = none found
>DEBUG [http-bio-8084-exec-24] - falling back to default type converter
>[com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter@5b6e6482]
>DEBUG [http-bio-8084-exec-24] - Retrieving convert for class [class
>com.sparecreative.sms.gateway.action.ClientAction] and property
>[documentContentLength]
>DEBUG [http-bio-8084-exec-24] - Converter is null for property
>[documentContentLength]. Mapping size [0]:
>DEBUG [http-bio-8084-exec-24] - field-level type converter for property
>[documentContentLength] = none found
>DEBUG [http-bio-8084-exec-24] - Retrieving convert for class [class
>com.sparecreative.sms.gateway.action.ClientAction] and property
>[documentContentLength.documentContentLength]
>DEBUG [http-bio-8084-exec-24] - global-level type converter for property
>[documentContentLength] = none found
>DEBUG [http-bio-8084-exec-24] - falling back to default type converter
>[com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter@5b6e6482]
>DEBUG [http-bio-8084-exec-24] - Creating converter of type
>[com.opensymphony.xwork2.conversion.impl.StringConverter]
>DEBUG [http-bio-8084-exec-24] - Streaming result [inputStream]
>type=[${documentContentType}] length=[${documentContentLength}]
>content-disposition=[${documentFileName}] charset=[null]
>DEBUG [http-bio-8084-exec-24] - Streaming to output buffer +++ START +++
>DEBUG [http-bio-8084-exec-24] - Streaming to output buffer +++ END +++
>DEBUG [http-bio-8084-exec-24] - after Locale=en_AU
>DEBUG [http-bio-8084-exec-24] - intercept }
>
>
>



---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org


Mime
View raw message