java - تنزيل ملف من وحدات التحكم في الربيع



4 Answers

كنت قادراً على دفق هذا الخط باستخدام الدعم المضمّن في الربيع مع ResourceHttpMessageConverter. سيؤدي ذلك إلى ضبط طول المحتوى ونوع المحتوى إذا كان يمكنه تحديد نوع المايم

@RequestMapping(value = "/files/{file_name}", method = RequestMethod.GET)
@ResponseBody
public FileSystemResource getFile(@PathVariable("file_name") String fileName) {
    return new FileSystemResource(myService.getFileFor(fileName)); 
}
java spring file download controller

لدي متطلبات حيث أحتاج إلى تنزيل ملف PDF من موقع الويب. يجب إنشاء ملف PDF داخل الكود ، والذي اعتقدت أنه سيكون مزيجًا من freemarker وإطار إنشاء PDF مثل iText. أي طريقة أفضل؟

ومع ذلك ، فإن مشكلتي الرئيسية هي كيف أسمح للمستخدم بتنزيل ملف من خلال جهاز التحكم في الربيع؟




باستخدام الإصدار 3.0 من Spring ، يمكنك استخدام كائن الإرجاع HttpEntity . إذا كنت تستخدم هذا ، فإن وحدة التحكم الخاصة بك لا تحتاج إلى كائن HttpServletResponse ، وبالتالي فمن السهل اختبار. باستثناء هذا ، هذه الإجابة نسبي يساوي واحدة من Infeligo .

إذا كانت قيمة الإرجاع لإطار pdf الخاص بك عبارة عن صفيف بايت (اقرأ الجزء الثاني من إجابتي لقيم الإرجاع الأخرى) :

@RequestMapping(value = "/files/{fileName}", method = RequestMethod.GET)
public HttpEntity<byte[]> createPdf(
                 @PathVariable("fileName") String fileName) throws IOException {

    byte[] documentBody = this.pdfFramework.createPdf(filename);

    HttpHeaders header = new HttpHeaders();
    header.setContentType(MediaType.APPLICATION_PDF);
    header.set(HttpHeaders.CONTENT_DISPOSITION,
                   "attachment; filename=" + fileName.replace(" ", "_"));
    header.setContentLength(documentBody.length);

    return new HttpEntity<byte[]>(documentBody, header);
}

إذا كان نوع الإرجاع الخاص بـ PDF Framework ( documentBbody ) ليس بالفعل صفيفًا للبايت (وأي أيضًا ByteArrayInputStream ) ، فمن الحكمة عدم جعله صفيفًا للبايت أولاً. بدلاً من ذلك ، من الأفضل استخدام:

سبيل المثال مع FileSystemResource :

@RequestMapping(value = "/files/{fileName}", method = RequestMethod.GET)
public HttpEntity<byte[]> createPdf(
                 @PathVariable("fileName") String fileName) throws IOException {

    File document = this.pdfFramework.createPdf(filename);

    HttpHeaders header = new HttpHeaders();
    header.setContentType(MediaType.APPLICATION_PDF);
    header.set(HttpHeaders.CONTENT_DISPOSITION,
                   "attachment; filename=" + fileName.replace(" ", "_"));
    header.setContentLength(document.length());

    return new HttpEntity<byte[]>(new FileSystemResource(document),
                                  header);
}



تعمل هذه التعليمة البرمجية بشكل جيد لتنزيل ملف تلقائيًا من جهاز التحكم في الربيع عند النقر فوق أحد الارتباطات على jsp.

@RequestMapping(value="/downloadLogFile")
public void getLogFile(HttpSession session,HttpServletResponse response) throws Exception {
    try {
        String filePathToBeServed = //complete file name with path;
        File fileToDownload = new File(filePathToBeServed);
        InputStream inputStream = new FileInputStream(fileToDownload);
        response.setContentType("application/force-download");
        response.setHeader("Content-Disposition", "attachment; filename="+fileName+".txt"); 
        IOUtils.copy(inputStream, response.getOutputStream());
        response.flushBuffer();
        inputStream.close();
    } catch (Exception e){
        LOGGER.debug("Request could not be completed at this moment. Please try again.");
        e.printStackTrace();
    }

}



ما يمكنني التفكير فيه بسرعة هو إنشاء ملف pdf وتخزينه في webapp / downloads / <RANDOM-FILENAME> .pdf من الكود وإرسال توجيه إلى هذا الملف باستخدام HttpServletRequest

request.getRequestDispatcher("/downloads/<RANDOM-FILENAME>.pdf").forward(request, response);

أو إذا كان بإمكانك تهيئة أداة حل مشكلات العرض ،

  <bean id="pdfViewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass"
              value="org.springframework.web.servlet.view.JstlView" />
    <property name="order" value=”2″/>
    <property name="prefix" value="/downloads/" />
    <property name="suffix" value=".pdf" />
  </bean>

ثم عاد للتو

return "RANDOM-FILENAME";



Related