
文章插圖
簡介上一篇文章我們學(xué)習(xí)了如何在netty中搭建一個HTTP服務(wù)器,討論了如何對客戶端發(fā)送的請求進(jìn)行處理和響應(yīng),今天我們來討論一下在netty中搭建文件服務(wù)器進(jìn)行文件傳輸中應(yīng)該注意的問題 。
文件的content-type客戶端向服務(wù)器端請求一個文件,服務(wù)器端在返回的HTTP頭中會包含一個content-type的內(nèi)容,這個content-type表示的是返回的文件類型 。這個類型應(yīng)該怎么確認(rèn)呢?
一般來說,文件類型是根據(jù)文件的的擴(kuò)展名來確認(rèn)的,根據(jù) RFC 4288的規(guī)范,所有的網(wǎng)絡(luò)媒體類型都必須注冊 。apache也提供了一個文件MIME type和擴(kuò)展名的映射關(guān)系表 。
因為文件類型比較多,我們看幾個比較常用到的類型如下:
MIME type擴(kuò)展名image/jpegjpgimage/jpegjpegimage/pngpngtext/plaintxt text conf def list log inimage/webpwebpapplication/vnd.ms-excelxlsapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheetxlsxapplication/msworddocapplication/vnd.openxmlformats-officedocument.wordprocessingml.documentdocxapplication/vnd.openxmlformats-officedocument.presentationml.presentationpptxapplication/vnd.ms-powerpointpptapplication/pdfpdfJDK提供了一個MimetypesFileTypeMap的類,這個類提供了一個getContentType方法,可以根據(jù)請求的文件path信息,來推斷其MIME type類型:
private static void setContentTypeHeader(HttpResponse response, File file) {MimetypesFileTypeMap mimeTypesMap = new MimetypesFileTypeMap();response.headers().set(HttpHeaderNames.CONTENT_TYPE, mimeTypesMap.getContentType(file.getPath()));}客戶端緩存文件對于HTTP的文件請求來說,為了保證請求的速度,會使用客戶端緩存的機(jī)制 。比如客戶端向服務(wù)器端請求一個文件A.txt 。服務(wù)器在接收到該請求之后會將A.txt文件發(fā)送給客戶端 。其請求流程如下:
步驟1:客戶端請求服務(wù)器端的文件===================GET /file1.txt HTTP/1.1步驟2:服務(wù)器端返回文件,并且附帶額外的文件時間信息:===================HTTP/1.1 200 OKDate:Mon, 23 Aug 2021 17:52:30 GMT+08:00Last-Modified:Tue, 10 Aug 2021 18:05:35 GMT+08:00Expires:Mon, 23 Aug 2021 17:53:30 GMT+08:00Cache-Control:private, max-age=60一般來說如果客戶端是現(xiàn)代瀏覽器的話,就會把A.txt緩存起來 。在下次調(diào)用的時候只需要在head中添加If-Modified-Since,詢問服務(wù)器該文件是否被修改了即可,如果文件沒有被修改,則服務(wù)器會返回一個304 Not Modified,客戶端得到該狀態(tài)之后就會使用本地的緩存文件 。步驟3:客戶端再次請求該文件===================GET /file1.txt HTTP/1.1If-Modified-Since:Mon, 23 Aug 2021 17:55:30 GMT+08:00步驟4:服務(wù)器端響應(yīng)該請求===================HTTP/1.1 304 Not ModifiedDate:Mon, 23 Aug 2021 17:55:32 GMT+08:00在服務(wù)器的代碼層面,我們首先需要返回一個響應(yīng)中通常需要的日期字段,如Date、Last-Modified、Expires、Cache-Control等: SimpleDateFormat dateFormatter = new SimpleDateFormat(HTTP_DATE_FORMAT, Locale.US);dateFormatter.setTimeZone(TimeZone.getTimeZone(HTTP_DATE_GMT_TIMEZONE));// 日期 headerCalendar 財路哥 = new GregorianCalendar();log.info(dateFormatter.format(財路哥.getTime()));response.headers().set(HttpHeaderNames.DATE, dateFormatter.format(財路哥.getTime()));// 緩存 headers財路哥.add(Calendar.SECOND, HTTP_CACHE_SECONDS);response.headers().set(HttpHeaderNames.EXPIRES, dateFormatter.format(財路哥.getTime()));response.headers().set(HttpHeaderNames.CACHE_CONTROL, "private, max-age=" + HTTP_CACHE_SECONDS);response.headers().set(HttpHeaderNames.LAST_MODIFIED, dateFormatter.format(new Date(fileToCache.lastModified())));然后在收到客戶端的二次請求之后,需要比較文件的最后修改時間和If-Modified-Since中自帶的時間,如果沒有發(fā)送變化,則發(fā)送304狀態(tài):
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請您及時就醫(yī)或請專業(yè)人士給予相關(guān)指導(dǎo)!
「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對您有所幫助:- 山大考研上線分
- 解讀夢見裝修別人房子 從夢境變化來看
- 徐崢光頭是脫發(fā)嗎
- excel一行變成上下兩行 把單元格一分為二
- 走遍天下什么為侶450
- 上吐下瀉胃痙攣什么原因
- 夢見天堂
- 夢見河里抓魚的寓意
- 上??】聦W(xué)校學(xué)費(fèi)
- 頸椎病刮痧有用處嗎
