JAVA讀取檔案流,設定瀏覽器下載或直接預覽
阿新 • • 發佈:2019-01-23
最近專案需要在瀏覽器中通過URL預覽圖片。但發現瀏覽器始終預設下載,而不是預覽。研究了一下,發現了問題:
// 設定response的Header,注意這句,如果開啟,預設瀏覽器會進行下載操作,如果註釋掉,瀏覽器會預設預覽。
response.addHeader("Content-Disposition", "attachment;filename=" + FileUtil.getOriginalFilename(path));
然後需要注意:
response.setContentType(contentType);//不同的檔案型別,contentType不一樣,比如圖片一般是image/jpeg、image/png等
@RequestMapping(value = "getFile/{folder}/{fileName:.+}*", method = RequestMethod.GET) public void getFile(HttpServletResponse response, @PathVariable String folder, @PathVariable String fileName) { // 設定編碼 response.setCharacterEncoding("UTF-8"); try { String path = folder + "/" + fileName; boolean flag = ossClient.doesObjectExist(ossProperties.getBucket(), path); // 判斷檔案是否存在 if (flag) { // 清空response response.reset(); // 設定response的Header,注意這句,如果開啟,預設瀏覽器會進行下載操作,如果註釋掉,瀏覽器會預設預覽。 // response.addHeader("Content-Disposition", // "attachment;filename=" + FileUtil.getOriginalFilename(path)); // response.addHeader("Content-Length", "" + buf.length); OutputStream toClient = new BufferedOutputStream(response.getOutputStream()); // ByteArrayOutputStream bos = new ByteArrayOutputStream(1024); OSSObject ossObject = ossClient.getObject(ossProperties.getBucket(), path); String contentType = ossObject.getObjectMetadata().getContentType(); System.out.println(contentType); //注意contentType型別 response.setContentType(contentType); byte[] buf = new byte[1024]; InputStream in = ossObject.getObjectContent(); int L; while ((L = in.read(buf)) != -1) { // if (buf.length != 0) // { toClient.write(buf, 0, L); // } } in.close(); // 寫完以後關閉檔案流 toClient.flush(); toClient.close(); // response.getOutputStream().write(bos.toByteArray()); } else { response.sendError(HttpServletResponse.SC_NOT_FOUND, "找不到相關資源"); } } catch (IOException e) { e.printStackTrace(); } }