2017-01-03 25 views
0

我無法找到爲什麼從我的服務器下載的mp3文件與之前保存的原始文件不同之處。從服務器下載的文件與以前保存的原始文件不同

這是我的控制器方法。文件(字節[]內容)的內容與該階段的原始文件相同 - 原始文件與從數據庫檢索到的文件相同(在調試器中檢查)。

@ResponseBody 
    @RequestMapping(method = RequestMethod.GET, value = "/{sampleId}/file") 
    public HttpEntity<byte[]> getFile(@PathVariable Long sampleId) { 
     ResourceEntity resourceEntity = testSampleRepository.getFile(sampleId); 
     byte[] content = resourceEntity.getContent(); 
     String fileName = resourceEntity.getFileName(); 
     HttpHeaders header = new HttpHeaders(); 
     header.setContentType(new MediaType("audio", "mpeg")); 
     header.set(HttpHeaders.CONTENT_DISPOSITION, 
       "attachment; filename=" + fileName.replace(" ", "_")); 
     header.setContentLength(content.length); 
     return new HttpEntity<byte[]>(content, header); 
    } 

這是文件有多大不同(左邊是原來的): enter image description here

爲什麼通過使用HTTP distors我的檔案? mediaTypes應該執行某些編碼嗎? (與「audio/mpeg」mediaType沒有區別,沒有它)。

+0

我覺得你的媒體類型不對,試試audio/mpeg3,https://www.sitepoint.com/web-foundations/mime-types-complete-list/ –

+4

你需要顯示下載文件的代碼,你需要說出哪一個是原始的,哪一個是下載的。從它的外觀來看,正確的文件包含純ASCII字符,因此它可能是base64編碼的(儘管通過HTTP連接不需要) –

+0

@ErwinBolwidt Base64可能來自FORM POST'multipart/form-data'上傳。 – Andreas

回答

2

它應該工作,如果你設置produces = "application/octet-stream"屬性(MediaType.APPLICATION_OCTET_STREAM)。否則,你被Spring的轉換器框架困住了。

你可能想看看這裏,看起來你的問題是非常相似的:Spring MVC: How to return image in @ResponseBody?

+0

謝謝。在使用@ResponseBody添加產品並且沒有產生後,我收到奇怪的異常,例如:HttpMediaTypeNotAcceptableException:找不到可接受的表示。 – Milso

+0

已解決HttpMediaTypeNotAcceptableException:需要使用簡單的Controller/RestController而不是RepositoryRestController(自定義Spring Data Rest存儲庫)。 – Milso