1. 程式人生 > >Spring3+mybatis3上傳圖片儲存至Sqlserver中和圖片顯示在網頁

Spring3+mybatis3上傳圖片儲存至Sqlserver中和圖片顯示在網頁

專案框架是 Spring3  和 Mybatis3

其實 有人會問我的專案的圖片怎麼會儲存的資料庫  這樣不是大大影響了資料庫的效能 

1.本專案比較小沒有關係的

2.圖片都加了驗證大小的不讓他超過140K 

3.對於要上傳一些大的檔案或者圖片來說 個人建議還是 存在伺服器上的資料夾中  資料庫裡面儲存一個路徑

1.配置檔案沒有什麼配置還是原來的Spring 和 mybatis的配置 沒有改動

不過看網上的資料  可以在Spring裡面配置上傳檔案的大小 ,我這邊是在頁面的JS裡面實現的

2.上傳頁面  HTML 程式碼

<form method="post" action="<c:url value="/addimage" />"
								enctype="multipart/form-data">
								<table id="touxiang" style="display: none;" width="99%"
									height="300px" border="0" align="center" cellpadding="0"
									cellspacing="0" bordercolor="#D3E4EB"
									style="border-collapse:collapse ">
									<tr>
										<td><font size="2" color="#663300"> <strong>
													<table>
														<tr>
															<td colspan="2" class="label"><font size="2"
																color="#ff0066">
																	<center>
																		<span id="errorTips"> </span>
																	</center>
															</font></td>
														</tr>
														<tr>
															<td colspan="" class="label">
																<center>檔案上傳</center>
															</td>
															<td class="label" align="left">
																<div id="d">
																	<input type="file" id="fileurl" name="fileurl" value=""
																		onChange="accp()" />
																</div>
															</td>
															<tr>
																<td colspan="2" class="label">
																	<center>
																		<font size="1" color="red">注意檔案的大小不能大於140K!檔案的格式jpg,png格式</font>
																	</center>
																</td>
															</tr>
															<tr>
																<td colspan="" valign="top" class="label">
																	<center>
																		圖片預覽</br> <input type="submit" value="上傳圖片">
																	</center>
																</td>
																<td class="label" align="left">
																	<div id="d">
																		<img id="img" onload="sizeCheck(this)" class="img"
																			height="200px" width="200px" src="">
																	</div>
																</td>
															</tr>
													</table>
											</strong>
										</font></td>
									</tr>
								</table>
							</form>

需要注意的是  from的 屬性 
<strong><span style="color:#ff0000;">enctype="multipart/form-data"</span></strong>

一定要填寫的 這是識別檔案上傳的

頁面需要的JS檔案

var MAXSIZE = 140 * 1024; //限制上傳圖片大小100K 


var ERROR_IMGSIZE = "圖片大小不能超過140K"; //圖片大小限制資訊 
function accp(){//顯示選擇圖片
	   var imgurl= document.getElementById("fileurl").value;
	  
						var filename="";
						if(imgurl.indexOf(".")>0){
						 filename=imgurl.substring(imgurl.lastIndexOf("."),imgurl.length);
						}
						else
						{
							filename=path;
						}
						var exp = /.\.jpg|.\.gif|.\.png|.\.bmp/i; 
	                    if(!exp.test(filename)){
							updateTips("圖片格式錯誤!請重新選擇圖片!");
				            document.getElementById("img").src="";  
						}
	   document.getElementById("img").src=imgurl;
	}
function updateTips(str) { //提示資訊
   document.getElementById("errorTips").innerHTML=str;  
} 
function sizeCheck(img) { 
     updateTips(""); 
     
	  if(img.readyState=="complete"||img.readyState=="loaded"){ //onload載入完成
		  
               if (img.fileSize > MAXSIZE) { //判斷圖片的大小是不是滿足
					updateTips(ERROR_IMGSIZE);
					document.getElementById("img").src="";
				}
        }else{
			updateTips("圖片載入未完成!請重新選擇圖片!");
			document.getElementById("img").src="";   
		}
} 
這邊注意的是  img的 onload方法 要判斷是否載入完  如果需要用onload方法 沒有載入完取出來的圖片屬性是準確的

前臺好了 我們說說SQL裡面的欄位  我們 儲存 圖片的SQL屬性是Sqlserver的IMAGE屬性

建立兩個欄位 一個是 useriamge  IMAGE  屬性    這個是儲存圖片的

                                     userimagestatus  INT 屬性  這個是我們讀取圖片時 第一次用來判斷的  預設是空  儲存圖片後 改成1

我們開始我們的後臺程式碼  

根據我們的spring的架構  我們先建實體類user。java

package com.netmarch.bean;
import java.io.Serializable;
public class User implements Serializable {
	private static final long serialVersionUID = -558463189792452716L;
	private int id;
	private String name;
	private String code;
	private String password;
	private int status;
	private String cdate;
	private String udate;
	private String ddate;
	private byte[] userimage;//儲存圖片的欄位
	private int userimagestatus;//儲存狀態的欄位
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getCode() {
		return code;
	}
	public void setCode(String code) {
		this.code = code;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public int getStatus() {
		return status;
	}
	public void setStatus(int status) {
		this.status = status;
	}
	public String getCdate() {
		return cdate;
	}
	public void setCdate(String cdate) {
		this.cdate = cdate;
	}
	public String getUdate() {
		return udate;
	}
	public void setUdate(String udate) {
		this.udate = udate;
	}
	public String getDdate() {
		return ddate;
	}
	public void setDdate(String ddate) {
		this.ddate = ddate;
	}
	public byte[] getUserimage() {
		return userimage;
	}
	public void setUserimage(byte[] userimage) {
		this.userimage = userimage;
	}
	public int getUserimagestatus() {
		return userimagestatus;
	}
	public void setUserimagestatus(int userimagestatus) {
		this.userimagestatus = userimagestatus;
	}
}
這裡要注意的是的 userimage的屬性是 byte[] 

好了 我們在處理我們的介面service

public void insertUserImage(User user);
public User getUserById(int id) throws Exception;
然後我們介面的實現類
public void insertUserImage(User user) {
		userMapper.insertUserImage(user);
	}
public User getUserById(int id) throws Exception {
<span style="white-space:pre">		</span>return userMapper.getUserById(id);
<span style="white-space:pre">	</span>}
在下面就是我們的mapper介面  (即執行操作資料庫的介面 對應一個XML檔案)
public void insertUserImage(User user);
public User getUserById(int id);
下面就是我們所對應的XML檔案  即是 mybatis操作資料庫語句配置檔案
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.netmarch.mapper.UserMapper">
	<select id="insertUser" parameterType="User" resultType="int">
		insert into t_user (name, code, password,cdate,status) values (#{name}, #{code}, sys.fn_VarBinToHexStr(hashbytes('MD5', #{password})),getdate(),1)
		SELECT cast(SCOPE_IDENTITY() as int) AS id
	</select>
	<delete id="removeUser" parameterType="int">
		update t_user set status = 0, ddate = getdate() where id = #{id}
	</delete>
	<select id="checkUser" parameterType="User" resultType="User">
     select t.* from t_user t where t.code = #{code} and password=sys.fn_VarBinToHexStr(hashbytes('MD5', #{password})) and t.status = 1
	</select>
	<update id="updateUser" parameterType="User">
		update t_User set code = code
			<if test="name != null"> , name = #{name} </if>
			<if test="password != null"> , password = sys.fn_VarBinToHexStr(hashbytes('MD5', #{password}) )</if>
		where id = #{id} 
	</update>
	<update id="insertUserImage" parameterType="User">
		update t_User set userimage = #{userimage} ,userimagestatus=1
		where id = #{id} 
	</update>
	<select id="getAllUser" resultType="User">
		SELECT  t.id, t.name, t.code, t.password,
		 t.status, convert(varchar, t.cdate, 20) as cdate,
		  convert(varchar, t.udate, 20) as udate, 
		  convert(varchar, t.ddate, 20) as ddate
		 FROM t_user t
		WHERE  t.status=1
	</select>
	<select id="findPageUser"  parameterType="Page" resultType="User">
		 SELECT top ${pageSize}  t.id, t.name, t.code, t.password,
		 t.status, convert(varchar, t.cdate, 20) as cdate, 
		 convert(varchar, t.udate, 20) as udate, 
		 convert(varchar, t.ddate, 20) as ddate ,userimage
		 FROM t_user t
		 WHERE t.id NOT IN
          (
          SELECT TOP (${pageSize}*(${pageNo}-1)) id FROM t_user where status=1  ORDER BY id
          )
         and t.status=1 ORDER BY t.id
	</select>
	<select id="getTotalPage" resultType="int">
		select count(*) from t_user where status=1
	</select>
	<select id="getUserById" parameterType="int" resultType="User">
		select 
			t.id, t.name, t.code, t.password, t.status, convert(varchar, t.cdate, 20) as cdate, convert(varchar, t.udate, 20) as udate, convert(varchar, t.ddate, 20) as ddate 
		,userimage,userimagestatus
		from 
			t_user t
		where
			t.status = 1
		and
			t.id = #{id}
	</select>
</mapper>
一切都萬事大吉了 開始我們最主要的 上傳圖片並儲存到資料庫  

頁面上的from提交到的servlet 我們根據Spring的註解建立起來 

下面是他的程式碼  最好你新建一個JAVA檔案 我們要把 上傳儲存 和  讀取顯示 寫在一個裡面這樣我們用起來 不叫方便也比較好看寫 

package com.netmarch.controller;
import java.io.*;
import java.util.Iterator;

import javax.servlet.http.*;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.*;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import com.netmarch.bean.User;
import com.netmarch.service.UserService;
@Controller
public class OutImage implements Serializable {
	private static final long serialVersionUID = -8444308537025394819L;
	private Logger logger = Logger.getLogger(OutImage.class);
	@Autowired
	private UserService userService;
	/**
	 * 讀取資料庫檔案並且顯示
	 * @param request
	 * @param response
	 * @param session
	 * @return
	 */
	@RequestMapping("/imageshow")
	public String userImage(HttpServletRequest request,HttpServletResponse response, HttpSession session) {
		session = request.getSession(true);
        User user=(User) session.getAttribute("user");
		response.setContentType("image/*"); // 設定返回的檔案型別
        OutputStream toClient=null;
        User user1 =null;
		try {
		toClient = response.getOutputStream();
         user1 =userService.getUserById(user.getId());
         if(user1.getUserimagestatus()==1){
        	 toClient.write(user1.getUserimage());
        	 toClient.close();
         }
		} catch (Exception e) {
		} 
		return "redirect:/";
	}
	/**
	 * 客戶端檔案儲存至資料庫
	 * @param request
	 * @param response
	 * @param session
	 * @param attr
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/addimage", method = RequestMethod.POST)
	public String login(HttpServletRequest request,HttpServletResponse response, HttpSession session,
			RedirectAttributes attr, Model model)  {
		 CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext()); //獲取前臺提交圖片
		 session = request.getSession(true);
         User user=(User) session.getAttribute("user");//從session中取出當前登入使用者
		if (multipartResolver.isMultipart(request)) // 判斷 request
													// 是否有檔案上傳,即多部分請求...
		{
			MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) (request);
			Iterator<String> iter = multiRequest.getFileNames();
			String path = "";// 檔案路徑
			while (iter.hasNext()) {
				MultipartFile file = multiRequest.getFile(iter.next());
				String fileName = "upload" + file.getOriginalFilename();// 獲取檔名稱
				String path1 = request.getSession().getServletContext().getRealPath("/");// 獲取伺服器的路徑
				path = path1 + "" + fileName;// 拼接檔案路徑
				File localFile = new File(path);
				try {
					file.transferTo(localFile);// 圖片上傳至 伺服器
				} catch (IllegalStateException e) {
				} catch (IOException e) {
				}
			}
		   try {
           FileInputStream is = new FileInputStream(path);
           int i = is.available(); // 得到檔案大小
           byte data[] = new byte[i];
           is.read(data); //讀資料
           is.close();
           user.setUserimage(data);
           userService.insertUserImage(user);
           File file =new File(path);
           file.delete();//刪除上傳至伺服器的檔案
		   }catch (Exception e) {
		}
       }
		return "redirect:/user/list";
	}
}
我把程式碼全貼出來了  

這裡 上傳 儲存 和  讀取的時候 要注意他們的 異常的處理

如果你的異常直接 throw  丟擲去的 話 有時候後雖然不會影響效果 但是 會報一些莫名其妙的錯誤 最好還是在程式碼裡面 try一下 這樣也有助於你的理解

還有就是 上傳到伺服器的檔案 一定要刪除了 不然 會影響你的伺服器哦

好了 下面接受圖片的就簡單了 只需要我們在 HTML加個標籤就好了

<img id="imageshow" src="<c:url value='/imageshow'/>" width="100" height="100">
這些路徑的請求都是根據spring註解來的 我就不介紹了
這樣 專案就完成了 效果 

給你們看看效果

犀利哈






相關推薦

Spring3+mybatis3圖片儲存Sqlserver中和圖片顯示網頁

專案框架是 Spring3  和 Mybatis3 其實 有人會問我的專案的圖片怎麼會儲存的資料庫  這樣不是大大影響了資料庫的效能  1.本專案比較小沒有關係的 2.圖片都加了驗證大小的不讓他超過140K  3.對於要上傳一些大的檔案或者圖片來說 個人建議還是 存在伺服器

微信公眾號 IOS多圖片儲存一張

wx.chooseImage({ count:imgCount, needResult: 1, sizeType:['original', 'compressed'], sourceType:['album', 'camera'], success:function(res){ ShowOKbt(false

PHP圖片同時儲存路徑到資料庫

本片文件記載如何將圖片上傳至自己制定的目錄檔案下,同時可以將資訊填入資料庫。本片文件部分技術內容參照w3school。 首先是HTML頁面: <form action="register.php" method="post" enctype="multipart/form-data" onSu

SpringMVC+mybatis實現圖片文字同時儲存資料庫中

個人專案中遇到同時上傳圖片及文字到資料庫中,網上查好多資料才解決,謹以此文記之。HTML程式碼:<form class="form-inline" id="zc_form" action="save.do" method="post" enctype="multip

Springmvc下實現多個圖片檔案的儲存

現在許多頁面都開始要求實現不定量圖片上傳,這裡給出一種利用java.MultipartFile類的方法,希望能對大家有幫助。 第一步新增jar包:在pom.xml裡面新增如下程式碼 <!-- uploadify檔案上傳元件 -->

海量圖片儲存方案

一、常規圖片儲存策略   常規的一般400G以下的圖片儲存可以採用比較傳統的分目錄的形式   例如目錄層級為  年份/行業屬性/月份/日期/使用者屬性   有幾個比較重要的原則就是   1、單個目錄下的檔案個數不要超過2000個,多了定址較慢   2、目錄層級結構不要太深,這樣伺服器處理定址較慢 二

Linux服務器通過aws命令行文件S3

aws linux s3 上傳文件目的Linux服務器通過AWS命令行上傳文件至S3配置打開你的AWS控制臺;連接你的Linux服務器,按照以下步驟操作;# 安裝pip yum -y install python-pip # 安裝awscli pip install awscli # 初始化配置 aw

文件ftp

ont {0} use code eth ftp request cnblogs .get public class UploadFile { string ftpServerIP; string ftpRemotePath;

iOS-AFNetworking3.0大量(1000張)圖片到服務器

gre top defined 內存 agen con 完全 任務 自動 背景: 最近項目要做上傳圖片功能,圖片必須是高清的,所以不讓壓縮,上傳圖片是大量的,比如幾百張,這個如果是用afn,將圖片直接for循環加入到formData裏會出現一個問題,臨時變量太多,導致內

php判斷文件是不是圖片,如果是,返回圖片格式

int 格式 unpack char .com intval 圖片格式 unp filename /判斷文件是不是圖片格式@param fileName 文件名@return array 如果code為1,是圖片;否則不是圖片@author lee complet@163.

vcenter 6.5文件存儲卷:提示不信任證書,導致無法

acc chrome瀏覽器 提示 blog str 現象 同時 上傳 獲得 故障現象:chrome瀏覽器瀏覽器上傳鏡至vcenter 6.5 存儲卷提示:由於不確定的原因,操作失敗。通常,當瀏覽器 不信任證書時會發生此問題。 解決方法:(1)登錄https://vcent

deploy和手動jar包nexus

一、nexus的好處        Maven預設提供的中央倉庫是在遠端網路服務Appache提供的,這對於我們開發時不合理的。如果我們沒網了或者什麼情況,我們怎麼辦?我們需要的jar包中央庫沒有或者是要收費怎麼辦?也就是說我們隊中央倉庫的依賴性太大。而N

windows本地專案linux伺服器中的gitlab

1、安裝git:    https://git-scm.com/downloads          linux伺服器中安裝gitlab:  https://blog.csdn.net/

多檔案multiparthttpservletrequest後臺接收多張圖片

前臺程式碼:                $("#fm").form("submit", {      &nb

ajax 多圖七牛雲

function imgChange(obj1, obj2) { //獲取點選的文字框 var file = document.getElementById("file"); //存放圖片的

android gradle module aar nexus

前言 這裡主要介紹一個android studio怎麼使用gradle把自已寫的一些module以aar包的方式上傳到公司內部的nexus私服中。這樣就即可以方便的進行程式碼複用,也可以保證程式碼的安全性,這樣在使用時,就可以分出一個人來單獨維護這個module. 詳細配置

圖片儲存本地-測試總結

昨天上線出了一個嚴重的問題,真是失誤,下面簡單說一下過程 產品經理找開發在版本之外加一個額外的“小”需求:長按圖片可至本地。知道這個需求後,覺得比較簡單,以至於測試用例都沒寫…感覺可能會牽涉到儲存許可權外,並叮囑開發注意許可權問題;測試期間主要關注下圖片是否儲存到本地就OK了。然而大錯特錯,一點都不OK,上

使用 html2cavas js外掛 將HTML頁面生成圖片儲存本地(pc端)

一, 匯入html2canvas.min.js 大家可以去html2canvas官網看看  http://html2canvas.hertzen.com/   二,把html頁面生成base64碼 //把html生成圖片 htmltoimg()

檔案儲存本地

<%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML> <html> <head> <title>檔案上傳</title> <scri

基於“formData批量的多種實現” 的多圖片預覽、的多種實現 formData批量的多種實現

  前言   圖片上傳是web專案常見的需求,我基於之前的部落格的程式碼(請戳:formData批量上傳的多種實現)裡的第三種方法實現多圖片的預覽、上傳,並且支援三種方式新增圖片到上傳列表:選擇圖片、複製貼上圖片、滑鼠拖拽圖片,同時支援從上傳列表中移除圖片(點選“X”號)      效果演示   選擇