1. 程式人生 > >Struts2將圖片輸出到頁面

Struts2將圖片輸出到頁面

input consola xwork long spa wid pre none 表單

在做CRUD的過程中,添加頁面是個表單,表單裏面有一項是上傳頭像文件。這樣表單提交後,頭像文件上傳了。但這個文件存的地址是本地硬盤的一個文件夾。在編輯頁面要做這個頭像的回顯的話,就需要我們去本地文件讀到這張圖片,然後將這張圖片輸出到頁面。 筆者很久都沒寫過怎麽把圖片輸出到頁面了,在網上看了點資料,感覺不夠清晰。於是決定自己做下筆記,方便後續查閱。

一、思路

既然是將圖片回顯,那麽頁面上圖片的src屬性肯定就是一個http請求,後臺處理這個請求是輸出一張圖片到瀏覽器
(1) 編輯頁面的使用 <img /> 標簽,然後src屬性值為一個http請求,這個請求帶了參數

(2) 後臺通過這個請求帶的參數,去數據庫中查出圖片的地址
(3) 後臺拿到圖片地址後,用輸入流和輸出流的方法,把圖片讀進來再輸出到瀏覽器

二、代碼

(1)頁面的代碼
  1. <td class="tdBg" width="200px">頭像:</td>
  2. <td>
  3. <!-- 顯示頭像 -->
  4. <img src="${basePath}nsfw/user_showHeadImg.action?user.id=${user.id}" width="100" height="100"/>
  5. <input
    type="file" name="headImg" accept = "image/*"/>
  6. </td>
(2)後臺代碼
這裏還有個圖片上傳的方法沒刪掉,方便後續查閱
  1. package com.tax.web.user;
  2. import java.io.BufferedInputStream;
  3. import java.io.BufferedOutputStream;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.IOException;
  7. import java
    .util.List;
  8. import java.util.UUID;
  9. import javax.servlet.http.HttpServletResponse;
  10. import org.apache.commons.io.FileUtils;
  11. import org.apache.commons.lang3.StringUtils;
  12. import org.apache.struts2.ServletActionContext;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import com.opensymphony.xwork2.ActionSupport;
  15. import com.tax.pojo.nsfw.User;
  16. import com.tax.service.UserService;
  17. /**
  18. * UserAction
  19. * @author ZENG.XIAO.YAN
  20. * @date 2017年7月11日 上午10:06:05
  21. * @version v1.0
  22. */
  23. public class UserAction extends ActionSupport {
  24. private static final long serialVersionUID = 4526496105243102063L;
  25. @Autowired
  26. private UserService userService;
  27. private User user;
  28. /** 文件上傳的3個屬性 */
  29. private File headImg; // 這個名字和表單的name的值一樣
  30. private String headImgFileName;
  31. private String headImgContentType;
  32. /** 存放圖片的本地文件夾 */
  33. private static final String USER_IMAGE_DIR = "D:/upload";
  34. /**
  35. * 展示用戶頭像 Action方法
  36. * @return 將頭像輸出到頁面
  37. * @see 訪問方式:tax/nsfw/user_showHeadImg.action?user.id=xxxx
  38. */
  39. public String showHeadImg() {
  40. // 這個user的id是通過前臺傳過來的
  41. if(null != user && user.getId() != null) {
  42. // 通過用戶id去數據庫查找出用戶頭像的地址
  43. String img = userService.findById(user.getId()).getHeadImg();
  44. if(StringUtils.isNotBlank(img)) {
  45. // 拼接成本地地址,如:D:/upload/user/0dc14d2b81444ce1b5600a3fe43f9f30.jpg
  46. // USER_IMAGE_DIR = D:/upload
  47. // img 如:user/0dc14d2b81444ce1b5600a3fe43f9f30.jpg
  48. File imgFile = new File(USER_IMAGE_DIR + "/" + img);
  49. // 如果圖片文件存在,就輸出到頁面
  50. if(imgFile.exists()) {
  51. /** 獲取HttpServletResponse */
  52. HttpServletResponse response = ServletActionContext.getResponse();
  53. /** 設置響應的內容類型 */
  54. response.setContentType("images/jpeg");
  55. /** 以下3行代碼用於設置禁止瀏覽器緩存該圖片 */
  56. response.setDateHeader("expries", -1);
  57. response.setHeader("Cache-Control", "no-cache");
  58. response.setHeader("Prama", "no-cache");
  59. // 以下為IO流操作
  60. BufferedInputStream bis = null;
  61. BufferedOutputStream bos = null;
  62. try {
  63. bis = new BufferedInputStream(new FileInputStream(imgFile));
  64. // 這個Response.getOutputStream()是用於輸出到瀏覽器的輸出流
  65. bos = new BufferedOutputStream(response.getOutputStream());
  66. byte[] buffer = new byte[1024];
  67. int len = 0;
  68. while ((len = bis.read(buffer)) != -1) {
  69. bos.write(buffer, 0, len);
  70. }
  71. } catch (Exception e) {
  72. e.printStackTrace();
  73. } finally {
  74. // 關流
  75. if (bis != null) {
  76. try {
  77. bis.close();
  78. } catch (IOException e) {
  79. e.printStackTrace();
  80. }
  81. }
  82. if (bos != null) {
  83. try {
  84. bos.close();
  85. } catch (IOException e) {
  86. e.printStackTrace();
  87. }
  88. }
  89. }
  90. }
  91. }
  92. }
  93. // 這裏沒有返回視圖,直接返回NONE
  94. return NONE;
  95. }
  96. /**
  97. * 專門用於文件上傳的方法,返回文件路徑
  98. * @return 文件路徑
  99. */
  100. private String uploadFile() {
  101. try {
  102. if (null != headImg) {
  103. // 獲取存放文件夾路徑
  104. // USER_IMAGE_DIR = D:/upload
  105. String prePath = USER_IMAGE_DIR.concat("/user");
  106. if(!new File(prePath).exists()) {
  107. new File(prePath).mkdirs();
  108. }
  109. // 新的文件名
  110. String fileName = UUID.randomUUID().toString().replaceAll("-", "")
  111. .concat(headImgFileName.substring(headImgFileName.lastIndexOf(".")));
  112. // 用common-io.jar的工具copy文件
  113. FileUtils.copyFile(headImg, new File(prePath,fileName));
  114. return "user/".concat(fileName);
  115. }
  116. } catch (IOException e) {
  117. e.printStackTrace();
  118. }
  119. return null;
  120. }
  121. /** setter and getter method */
  122. public User getUser() {
  123. return user;
  124. }
  125. public void setUser(User user) {
  126. this.user = user;
  127. }
  128. public File getHeadImg() {
  129. return headImg;
  130. }
  131. public void setHeadImg(File headImg) {
  132. this.headImg = headImg;
  133. }
  134. public String getHeadImgFileName() {
  135. return headImgFileName;
  136. }
  137. public void setHeadImgFileName(String headImgFileName) {
  138. this.headImgFileName = headImgFileName;
  139. }
  140. public String getHeadImgContentType() {
  141. return headImgContentType;
  142. }
  143. public void setHeadImgContentType(String headImgContentType) {
  144. this.headImgContentType = headImgContentType;
  145. }
  146. }


Struts2將圖片輸出到頁面