2016-03-02 14 views
0

我已經實現了一個Spring引導應用程序,該應用程序將GET請求中的圖像返回給getimage API,並且它適用於具有不同內容的圖像,但不適用於圖像是單一顏色。我可以在文件系統上看到圖像很好,它不會返回。單色不能通過REST API返回的PNG或JPEG

的代碼的返回的圖像A genericised版本如下:

public ResponseEntity<String> getImage(String pathToFile, HttpServletRequest request, HttpServletResponse response){ 

    if (new File(pathToFile).exists()){ 
     try { 
      response.setContentType("image/png"); 
      InputStream in = new FileInputStream(pathToFile); 
      IOUtils.copy(in, response.getOutputStream()); 
     } 
     catch (Exception e){ 
      response.setContentType("text/plain"); 
      return new ResponseEntity<String>("ERROR", HttpStatus.INTERNAL_SERVER_ERROR); 
     } 
    } 
    return new ResponseEntity<String>("", HttpStatus.OK); 
} 

響應標頭等等從成功的請求(來自JMeter的採取):

Thread Name: Thread Group 1-1 
Sample Start: 2016-03-02 15:51:26 GMT 
Load time: 2044 
Connect Time: 1 
Latency: 4 
Size in bytes: 310323 
Headers size in bytes: 150 
Body size in bytes: 310173 
Sample Count: 1 
Error Count: 0 
Response code: 200 
Response message: OK 

Response headers: 
HTTP/1.1 200 OK 
Server: Apache-Coyote/1.1 
Content-Type: image/png;charset=UTF-8 
Transfer-Encoding: chunked 
Date: Wed, 02 Mar 2016 15:51:26 GMT 


HTTPSampleResult fields: 
ContentType: image/png;charset=UTF-8 
DataEncoding: UTF-8 

響應標頭從一個失敗的請求,與單色圖像:

Thread Name: Thread Group 1-1 
Sample Start: 2016-03-02 16:24:44 GMT 
Load time: 5 
Connect Time: 1 
Latency: 5 
Size in bytes: 2056 
Headers size in bytes: 2056 
Body size in bytes: 0 
Sample Count: 1 
Error Count: 0 
Response code: 200 
Response message: OK 

Response headers: 
HTTP/1.1 200 OK 
Server: Apache-Coyote/1.1 
Accept-Charset: big5, big5-hkscs, euc-jp, euc-kr, gb18030, gb2312, gbk, ibm-thai, ibm00858, ibm01140, ibm01141, ibm01142, ibm01143, ibm01144, ibm01145, ibm01146, ibm01147, ibm01148, ibm01149, ibm037, ibm1026, ibm1047, ibm273, ibm277, ibm278, ibm280, ibm284, ibm285, ibm290, ibm297, ibm420, ibm424, ibm437, ibm500, ibm775, ibm850, ibm852, ibm855, ibm857, ibm860, ibm861, ibm862, ibm863, ibm864, ibm865, ibm866, ibm868, ibm869, ibm870, ibm871, ibm918, iso-2022-cn, iso-2022-jp, iso-2022-jp-2, iso-2022-kr, iso-8859-1, iso-8859-13, iso-8859-15, iso-8859-2, iso-8859-3, iso-8859-4, iso-8859-5, iso-8859-6, iso-8859-7, iso-8859-8, iso-8859-9, jis_x0201, jis_x0212-1990, koi8-r, koi8-u, shift_jis, tis-620, us-ascii, utf-16, utf-16be, utf-16le, utf-32, utf-32be, utf-32le, utf-8, windows-1250, windows-1251, windows-1252, windows-1253, windows-1254, windows-1255, windows-1256, windows-1257, windows-1258, windows-31j, x-big5-hkscs-2001, x-big5-solaris, x-compound_text, x-euc-jp-linux, x-euc-tw, x-eucjp-open, x-ibm1006, x-ibm1025, x-ibm1046, x-ibm1097, x-ibm1098, x-ibm1112, x-ibm1122, x-ibm1123, x-ibm1124, x-ibm1364, x-ibm1381, x-ibm1383, x-ibm300, x-ibm33722, x-ibm737, x-ibm833, x-ibm834, x-ibm856, x-ibm874, x-ibm875, x-ibm921, x-ibm922, x-ibm930, x-ibm933, x-ibm935, x-ibm937, x-ibm939, x-ibm942, x-ibm942c, x-ibm943, x-ibm943c, x-ibm948, x-ibm949, x-ibm949c, x-ibm950, x-ibm964, x-ibm970, x-iscii91, x-iso-2022-cn-cns, x-iso-2022-cn-gb, x-iso-8859-11, x-jis0208, x-jisautodetect, x-johab, x-macarabic, x-maccentraleurope, x-maccroatian, x-maccyrillic, x-macdingbat, x-macgreek, x-machebrew, x-maciceland, x-macroman, x-macromania, x-macsymbol, x-macthai, x-macturkish, x-macukraine, x-ms932_0213, x-ms950-hkscs, x-ms950-hkscs-xp, x-mswin-936, x-pck, x-sjis_0213, x-utf-16le-bom, x-utf-32be-bom, x-utf-32le-bom, x-windows-50220, x-windows-50221, x-windows-874, x-windows-949, x-windows-950, x-windows-iso2022jp 
Content-Type: text/plain;charset=UTF-8 
Content-Length: 0 
Date: Wed, 02 Mar 2016 16:24:44 GMT 


HTTPSampleResult fields: 
ContentType: text/plain;charset=UTF-8 
DataEncoding: UTF-8 

空的失敗請求似乎表明InputStream/IOUtils執行沒有正常工作。如果我忘記包含任何內容,請告訴我。

編輯:我在圖像編輯器中打開有問題的不返回圖像,並在它上面畫一條曲線 - 現在它可以很好地下載。這個問題肯定是IOUtils複製一個彩色圖像的流,但爲什麼?

我已經縮小到怪異的情況:如果圖像是8kb,它不會返回。如果它調整大小以至於9kb +,它將成功返回。在IOUtils.copy中是否有一個最小緩衝區?

+0

你得到這個響應,因爲你請求的文件不存在或不能訪問,因爲權限 –

+0

該文件是肯定存在的,我可以在文件系統中看到它,隨後的測試顯示「if file exists 「部分代碼正在執行中。 它也不能是一個權限的事情,因爲成功返回的其他圖像是在同一個文件夾中。 問題確實似乎是IOUtils.copy沒有完成它的工作,但爲什麼單個彩色圖像會影響它呢? – HomerPlata

+0

change'return new ResponseEntity (「」,HttpStatus.OK);''返回新ResponseEntity (pathToFile +「不存在」,HttpStatus.OK);' –

回答

0

我已經在標題中明確設置內容長度解決它:

File actualFile = new File(pathToFile); 
if (actualFile.exists()){ 
    try { 
     response.setContentType("image/png"); 
     response.setHeader("Content-Length", String.valueOf(actualFile.length())); 
     InputStream in = new FileInputStream(pathToFile); 
     IOUtils.copy(in, response.getOutputStream()); 
    } 
    catch (Exception e){ 
     ... 
    } 
} 

這是一個問題,我在這裏問的早期版本:Response fails to return image when outputBuffer bytesWritten < 8kb

可以關閉的重複。