22

I'm trying to craete a site which allows users to upload any file type they like. I've implemented this feature fine, and the file is held on the server. Later on they can download the file to view, but i'm having trouble getting it to work.

I've used any examples I can get hold of but they all tend to use text files as examples. My problem is that pdf's and many other file types aren't downloading properly. They seem to download fine, but none of the files will open successfully. Comparing the files, it seems most of the files content is correct, but certain parts are not.

Here's my groovy code:

def file = new File(params.fileDir)    
response.setContentType("application/octet-stream")
response.setHeader("Content-disposition", "filename=${file.getName()}")
response.outputStream << file.text
return

This code is held inside a controller which is called by a download link. I've tried playing around with different contentTypes, but I don't know which I could use for any type - is there one? Anything I try doesn't solve the problem.

Thanks for your help.

bignose
  • 30,281
  • 14
  • 77
  • 110
James Camfield
  • 1,636
  • 3
  • 16
  • 24

1 Answers1

41

The problem is that you read the content of the file into a String by using "file.text". The content of the file is converted with the system character encoding even if the content is binary, not text (eg. PDF files are binary) and sent to the client using the response encoding and thereby modifing the binary content. You should rather use a different approach like this:

def file = new File(params.fileDir)    
response.setContentType("application/octet-stream")
response.setHeader("Content-disposition", "attachment;filename=${file.getName()}")

response.outputStream << file.newInputStream() // Performing a binary stream copy
Siegfried Puchbauer
  • 6,539
  • 34
  • 24
  • Nice one thanks. I was using the .text method but didn't know what it was actually doing - couldn't find any documentation on it :/ – James Camfield Dec 29 '08 at 09:25
  • You can find the documentation inside the Groovy JDK (a documentation of the dynamic extensions to the Java SDK by Groovy). In this case it is the java.io.File.getText() method which is invoked: http://groovy.codehaus.org/groovy-jdk/java/io/File.html#getText() – Siegfried Puchbauer Dec 29 '08 at 09:35
  • Does anybody know how to put many files to response? Any examles? – Eugene Hoza Aug 01 '13 at 13:18
  • Can you tell me what params.fileDir is? The exact value? I'm trying the same thing but I have a byte array, content type etc stored in an object that I need to put in the downloaded file. Thanks! – usb Dec 18 '14 at 22:39