2013-08-06 42 views
5

Tôi có một hành động ghi trực tiếp vào luồng đầu ra. Đôi khi tôi nhận được những điều sau đây để các lỗi:Lỗi xử lý GroovyPageView: getOutputStream() đã được gọi cho phản hồi này

Error processing GroovyPageView: getOutputStream() has already been called for this response 
Caused by getOutputStream() has already been called for this response 

và một này:

Executing action [getImage] of controller [buddyis.ItemController] caused exception: Runtime error executing action 
Caused by Broken pipe 

Làm thế nào tôi có thể giải quyết những vấn đề này? Hành động tôi sử dụng được liệt kê bên dưới.

LƯU Ý: Tôi sử dụng Tomcat 7.0.42, nếu điều này quan trọng!

def getImage() { 
    byte [] imageByteArray = // some image bytes 

    response.setHeader 'Content-disposition', "attachment; filename=\"${imageName}${imageExtension}\"" 
    response.setContentType("image/pjpeg; charset=UTF-8") 
    response.contentLength = imageByteArray.size() 
    response.outputStream.write(imageByteArray) 
    response.outputStream.flush() 
    response.outputStream.close() 
    return 
} 
+0

Cố gắng hiển thị một thứ gì đó (giả) để lập chỉ mục hoặc hiển thị mã trạng thái và xem liệu bạn có gặp sự cố không. Bạn có thể bắt đầu với 'render (status: 200)' hoặc ít nhất 'render" Done "' etc trước khi trả về. – dmahapatro

+0

Tại sao thực hiện việc này? – confile

+0

Tham khảo [câu hỏi này] (http://stackoverflow.com/questions/13184603/grails-error-using-httpservletresponse-to-export-file-for-download). – dmahapatro

Trả lời

6

Tôi không biết tại sao bạn nhận được lỗi đó, tuy nhiên dưới đây là những gì tôi làm việc đó mọi lúc.

Tôi không gọi .flush() hoặc .close()

response.setContentType("application/octet-stream") 
response.setHeader("Content-disposition", "filename=\"${name}\"") 
response.setContentLength(imageByteArray.size()) 
response.outputStream << imageByteArray 

Sử dụng trên nó đã làm việc tốt, cho đến khi tôi phát hiện ra người dùng có thể hủy tải về, mà gây ra một ngoại lệ. Đây là mã đầy đủ tôi sử dụng thay vì response.outputStream << imageByteArray:

def outputStream = null 
    try { 
     outputStream = response.outputStream 
     outputStream << imageByteArray 

    } catch (IOException e){ 
     log.debug('Canceled download?', e) 
    } finally { 
     if (outputStream != null){ 
      try { 
       outputStream.close() 
      } catch (IOException e) { 
       log.debug('Exception on close', e) 
      } 
     } 
    } 
+0

Tôi sử dụng Tomcat 7.0.42, nếu điều này quan trọng đối với câu trả lời? Tại sao ContentType lại là "application/octet-stream"? – confile

+0

Tôi nghĩ rằng tôi đang sử dụng 7,0,39 để không quan trọng. Theo loại nội dung - tôi cho phép tải xuống/tải lên nhiều loại tệp. Điều này dường như làm việc cho tất cả. –

+0

Được rồi và những gì về .flush() và .close() tại sao bạn không cần điều đó? – confile

0

Tôi có vấn đề này trong khi chạy grails 2,5 trên tomcat: 7.0.55.3 và với grails java-giai điệu cài đặt plugin. Sau khi gỡ cài đặt java-melody, nó hoạt động tốt

Các vấn đề liên quan