複製粘貼出來的悲劇----spring實現文件下載和HttpStatus.CREATED

来源:http://www.cnblogs.com/chyu/archive/2016/03/14/5277227.html
-Advertisement-
Play Games

今天真是被自己的懶惰和複製粘貼給坑慘了... 網上有這麼一個spring下載文件的最佳實踐: 可以看到返回狀態給的是HttpStatus.CREATED(201),這個當時想當然的認為既然是下載文件,肯定是新創建,所以create也沒什麼,也就沒進一步仔細查詢一下201狀態碼的意義.然後呢這段代碼實


今天真是被自己的懶惰和複製粘貼給坑慘了...

網上有這麼一個spring下載文件的最佳實踐:

@RequestMapping("download")  
public ResponseEntity<byte[]> download() throws IOException {  
    HttpHeaders headers = new HttpHeaders();  
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);  
    headers.setContentDispositionFormData("attachment", "xxx.txt");  
    return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(getDictionaryFile()),  
                                      headers, HttpStatus.CREATED);  
}

可以看到返回狀態給的是HttpStatus.CREATED(201),這個當時想當然的認為既然是下載文件,肯定是新創建,所以create也沒什麼,也就沒進一步仔細查詢一下201狀態碼的意義.然後呢這段代碼實際上在谷歌和火狐上執行是一點問題沒有的,所以一直以來就這麼複製粘貼複製再粘貼...直到今天發現這段代碼實際上在ie上是有問題的.

然後折騰了一下午加上一晚上,一直以為是MediaType的問題,換了n種方式依然未果.因為我知道這裡返回HttpStatus.OK也是可以,所以只是麻木的各種嘗試把它換成OK(200),結果在ie下真就好了.這才想起來仔細查詢一下HttpStatus.CREATED(201)的含義,大體含義如下:

伺服器已經創建了文檔,Location頭給出了它的URL。

源碼中給的參考地址已經無法訪問,所以只能簡單的百度一下http狀態碼,上面只是其中的一種解釋,但是大體都是說伺服器已經創建了文檔,這個實際上和下載文件沒半點關係..

所以正確的寫法應該是:

@RequestMapping("download")  
public ResponseEntity<byte[]> download() throws IOException {  
    HttpHeaders headers = new HttpHeaders();  
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);  
    headers.setContentDispositionFormData("attachment", "xxx.txt");  
    return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(getDictionaryFile()),  
                                      headers, HttpStatus.OK);  
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、Java的特點:一次編譯,到處運行時間。   C語言在windows下執行:C源程式(.c)——>編譯 windows可執行文件(.exe)——>windows操作系統  Java語言:Java源文件——>編譯 Java位元組碼文件(.class)——>JVM虛擬機下 (能直接解釋Java位元組碼C
  • -->位元組碼解釋器工作就是通過改變這個計數器的值來選取下一條需要執行的位元組碼指令,分支、迴圈、跳轉、異常處理、線程恢復等基礎功能都需要依賴計數器來完成。 -->為了線程切換後能恢復到正確的執行位置,每條線程都需要一個獨立的程式計數器,各條線程之間計數器互不影響,獨立存儲,我們稱這類記憶體區域為"線程私
  • 初學python第一天,希望自己真正瞭解電腦語言,並且做出成效。   寫下學習筆記,記錄學習進度,娛樂學習,不斷成長。   python詳細介紹:   python是什麼?運用到哪裡?有哪些在使用它? python是一門編程語言,可以運用到各種場景,基本大型公司都在用它,主要運用在網路編程方面。如
  • 這是個Linux上簡易的http伺服器實現,主要就是tcp socket 和 pipe管道cgi重定向. 解析http協議. 簡單的處理並反饋給客戶端.並附帶一個client.c 測試服務端. 比較簡陋 去掉註釋400行以下. 能夠幫我們加深web伺服器的理解.
  • Java是天生就支持併發的語言,支持併發意味著多線程,線程的頻繁創建在高併發及大數據量是非常消耗資源的,因為java提供了線程池。在jdk1.5以前的版本中,線程池的使用是及其簡陋的,但是在JDK1.5後,有了很大的改善。JDK1.5之後加入了java.util.concurrent包,java.u
  • 本篇分兩部分:   在 OC 開發中,我們通常會將 error 置為 nil   在絕大多數情況下,這個方法並不會發生什麼錯誤,所以我們將 error 直接設置為 nil。但是出錯的時候可能就會無從下手進行調試。在 Swift 中引入了異常機制,這讓我們老牌程式員感到異常親切,因為在 java 或
  • 繼承 概念: ①   繼承背後的思想就是基於已存在的類來構建新類; ②   當從已存在類繼承時,就重用了它的方法和屬性,還可以添加新的方法和屬性來定製新類以應對需求; ③   當從其它類導出的類叫作子類,被導出的類叫作父類; ④   在Java中,除了Object類外,所有類都是子類,都有唯一父類;
  •  
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...