2015-09-14 90 views
1

我想下載一個文件,併爲我寫了這個代碼:下載文件

public void downoadResume(@PathVariable("id") int id, HttpServletResponse response) { 
try { 
    Applicant applicant = applicantService.getOne(id); 
    File file = new File(DocumentConstants.DOCUMENTS_PATH + "/" + applicant.getOriginalDocPath()); 
    // get your file as InputStream 
    InputStreamReader is = new InputStreamReader(new FileInputStream(file.getAbsolutePath())); 
    // copy it to response's OutputStream 
    org.apache.commons.io.IOUtils.copy(is, response.getOutputStream()); 
    is.close(); 
    response.flushBuffer(); 
} catch (IOException ex) { 
    ex.printStackTrace(); 
} catch (ResourceNotFoundException e) { 
    e.printStackTrace(); 
} 

} 

但我得到這樣的回答,而不是文件時,請確認:

PK!�?�*��[Content_Types].xml �(���Oo�@��H|k���i�8=��X*���8Y���3i�o��I�RLHs���罟��3��g��G�hc��e5? 
�Z|�ߕE?��Q.��P\�޿��7 ��ꀵX�OR�^?WX�?O���"��K����� �&�R�@��VC̦��QkG��3��%��P7�[�Z���Պ�T>�ʥ�9T\�݃+���1�thO�n�����dk�xP���g���&���g��pƦ���V-���3���O��a�?ġ�H���NZ�?c�˓qz�V2Y�3b��k����'��F/}(�i�ߞ`�{��wK�ۦ�]?����Z��w"���߿�r��p�<����g�x!> 
��H!�9�}/= 
���a�<����#:�����^���gQ'sȒGe7�x���x���h�K��G̻ޑ���9C���o٭��/��PK!���N_rels/.rels �(����JA���a�}7� 
"���H�w"����w̤ھ�� �P�^����O֛���;�<�aYՠ؛`G�kxm��PY�[��g 
Gΰino�/<���<�1��ⳆA$>"f3��\�ȾT�?I S?���������W����Y 
ig�@��X6_�]7~ 
f��ˉ�ao�.b*lI�r?j)�,l0�%?�b� 
6�i���D�_���, � ���|u�Z^t٢yǯ;!Y,}{�C��/h>��PK!����g�word/_rels/document.xml.rels �(����N�0��H�C�;�:`�[email protected]�����N[��U�{{¦u۲K/��G����?���:��*4)K���H�+S��-{��c�#arQ�?�������b�� ��+��E>�q)+���?,AcƟ(�Z?m�!?E|8����`ӽ��<O�?��~�j|���Q�J�#ʥCGJp0�A�W�2a��m��s2~��OG����C��}�W������ a�z֯�n��H��?KG�?���e�cު�"�I�f�'�7,^?�����1r�'�;��*!���Fϔ�}�n,�?���?ܜ`Е��PQ,Q�?K���x߀��)�WT>)�:�88 
5���;<oY 

你能告訴我在這段代碼中我做了什麼錯誤嗎?

+0

爲什麼你返回void而不是返回ResponseEntity。你也展示了你如何映射你的控制器。 –

+4

它的一個zip文件,你沒有指定MIME類型 –

+0

@ WeareBorg-我也嘗試過也返回ResponseEntity,仍然得到相同的結果 – Vipul

回答

0

看來你正在下載的XLSX文件,試試下面的代碼:

public void downoadResume(@PathVariable("id") int id, HttpServletResponse response) { 
    try { 
     Applicant applicant = applicantService.getOne(id); 
     File file = new File(DocumentConstants.DOCUMENTS_PATH + "/" + applicant.getOriginalDocPath()); 
response.reset(); 
      response.resetBuffer(); 
      response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); 
      response.setContentLength((int) file.length()); 
      response.setHeader("Content-Disposition", "attachment; filename=test.xlsx"); 
     // get your file as InputStream 
     InputStreamReader is = new InputStreamReader(new FileInputStream(file.getAbsolutePath())); 
     // copy it to response's OutputStream 
     org.apache.commons.io.IOUtils.copy(is, response.getOutputStream()); 
     is.close(); 
     response.flushBuffer(); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } catch (ResourceNotFoundException e) { 
     e.printStackTrace(); 
    } 

    } 
+0

不,我試圖下載.docx文件而不是xlsx文件,是否有任何其他方式來定義它爲不同類型的文件 – Vipul

+0

您可以嘗試'Files.probeContentType(DocumentConstants.DOCUMENTS_PATH +「/」+ applicant.getOriginalDocPath() )'作爲內容類型 –

2

您需要設置響應頭和內容類型觸發瀏覽器對待響應內容爲文件,不作爲網頁:

response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");  
response.setHeader("Content-Disposition", "attachment; filename=download.xlsx"); 
+0

@ DSF-我試圖通過替換這樣的代碼來下載一個.docx文件 response.setContentType(「application/vnd.openxmlformats-officedocument.wordprocessingml.document」); response.setHeader(「Content-Disposition」,「attachment; filename = test.docx」); 儘管文件被下載,但並未保存爲.docx文件。一個很長的名字被用作文件名。 – Vipul

+0

您可以有不同的行爲取決於您使用的瀏覽器。 –