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檔案
這邊注意的是 img的 onload方法 要判斷是否載入完 如果需要用onload方法 沒有載入完取出來的圖片屬性是準確的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=""; } }
前臺好了 我們說說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”號) 效果演示 選擇