2016-02-28 14 views
9

से एक फ़ाइल डाउनलोड करें मैं स्प्रिंग बूट आराम सेवा से एक फ़ाइल डाउनलोड करने का प्रयास कर रहा हूं।स्प्रिंग बूट आराम सेवा

@RequestMapping(path="/downloadFile",method=RequestMethod.GET) 
    @Consumes(MediaType.APPLICATION_JSON_VALUE) 
    public ResponseEntity<InputStreamReader> downloadDocument(
       String acquistionId, 
       String fileType, 
       Integer expressVfId) throws IOException { 
     File file2Upload = new File("C:\\Users\\admin\\Desktop\\bkp\\1.rtf"); 
     HttpHeaders headers = new HttpHeaders(); 
     headers.add("Cache-Control", "no-cache, no-store, must-revalidate"); 
     headers.add("Pragma", "no-cache"); 
     headers.add("Expires", "0"); 
     InputStreamReader i = new InputStreamReader(new FileInputStream(file2Upload)); 
     System.out.println("The length of the file is : "+file2Upload.length()); 

     return ResponseEntity.ok().headers(headers).contentLength(file2Upload.length()) 
       .contentType(MediaType.parseMediaType("application/octet-stream")) 
       .body(i); 
     } 

जब मैंने ब्राउज़र से फ़ाइल डाउनलोड करने का प्रयास किया, तो यह डाउनलोड शुरू होता है, लेकिन हमेशा विफल रहता है। क्या सेवा में कुछ गड़बड़ है जिससे डाउनलोड विफल हो रहा है?

उत्तर

27

विकल्प 1 एक दिया InputStream के लिए एक InputStreamResource

Resource कार्यान्वयन का उपयोग।

केवल तभी उपयोग किया जाना चाहिए जब कोई अन्य विशिष्ट संसाधन कार्यान्वयन लागू न हो। विशेष रूप से, जहां संभव हो, ByteArrayResource या फ़ाइल-आधारित संसाधन कार्यान्वयन में से कोई भी पसंद करते हैं।

@RequestMapping(path = "/download", method = RequestMethod.GET) 
public ResponseEntity<Resource> download(String param) throws IOException { 

    // ... 

    InputStreamResource resource = new InputStreamResource(new FileInputStream(file)); 

    return ResponseEntity.ok() 
      .headers(headers) 
      .contentLength(file.length()) 
      .contentType(MediaType.parseMediaType("application/octet-stream")) 
      .body(resource); 
} 

Option2 InputStreamResource के प्रलेखन के रूप में पता चलता है - एक ByteArrayResource का उपयोग कर:

@RequestMapping(path = "/download", method = RequestMethod.GET) 
public ResponseEntity<Resource> download(String param) throws IOException { 

    // ... 

    Path path = Paths.get(file.getAbsolutePath()); 
    ByteArrayResource resource = new ByteArrayResource(Files.readAllBytes(path)); 

    return ResponseEntity.ok() 
      .headers(headers) 
      .contentLength(file.length()) 
      .contentType(MediaType.parseMediaType("application/octet-stream")) 
      .body(resource); 
} 
+2

Option2 समस्या हल हो। – kiran

+0

मैं इसे शब्द दस्तावेज़। डॉक प्रारूप के लिए करने की कोशिश कर रहा हूं, लेकिन प्रारूप डाउनलोड करते समय फ़ाइल समाप्त हो गई है और फाइल एक्सटेंशन के बिना फ़ाइल डाउनलोड की गई है और फ़ाइल नाम डाउनलोड करते समय प्रतिक्रिया है। कोई उपाय? –

+3

@ तुलसीजैन सामग्री-डिस्पोजिशन एचटीपीएचडर जोड़ें: 'एचटीपी हेडर हेडर = नया एचटीपी हैडर(); headers.add (HttpHeaders.CONTENT_DISPOSITION, "अनुलग्नक; फ़ाइल नाम = myDoc.docx"); ' – fateddy