[Java] تنزيل ملف من وحدات التحكم في الربيع


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)); 
}
Question

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

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




تعمل هذه التعليمة البرمجية بشكل جيد لتنزيل ملف تلقائيًا من جهاز التحكم في الربيع عند النقر فوق أحد الارتباطات على 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();
    }

}



باستخدام الإصدار 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);
}



ما يمكنني التفكير فيه بسرعة هو إنشاء ملف 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";