圖片上傳實現

圖片上傳

  • change函數
  • 圖片上傳
    • 圖片上傳到服務器
    • 上傳的圖片在該頁面中顯示
    • 修改界面代碼
  • 最終實現效果

change函數

這里我們先用輸入框控件來舉例:

姓名:<input type='text' class='name'>

在這里插入圖片描述

下面我們來寫 js 語句,對控件進行綁事件來獲取輸入框內的值,我們嘗試一下 click 函數是否可以

$(".name").click(function(){alert($(".name").val())
})

點擊控件后直接彈窗,發現彈窗的內容為

在這里插入圖片描述

這是因為 click點擊就觸發事件,不往下進行,點擊控件立馬觸發點擊事件,沒有在控件中輸入值的機會,無法獲取該控件的值,點擊后才能在控件中輸入值,可是這個時候獲取值的操作已經結束了

所以如果要獲取輸入框的值的話,需要先輸入再觸發事件,change 函數可以做到,表示值改變再觸發事件

$(".name").change(function(){alert($(".name").val())
})

此時我們點擊控件再輸入值,當輸入完畢后會出現彈窗,彈窗內的值就是我們所需要的數值

在這里插入圖片描述

圖片上傳

圖片上傳到服務器

圖片上傳所需要用到的控件:

<input type='file' class='file'>

在這里插入圖片描述

$(".file").change(function(){console.log($(".file").val())
})

打印該控件的值內容如下:

在這里插入圖片描述

(".file").val() 只有一段字符串,不是咱們需要的值,咱們需要把圖片上傳到項目的部署目錄里,需要的是在項目的部署目錄里圖片的信息
而圖片沒辦法直接直接上傳到服務器,發起請求能夠傳輸的數據只能是字符串,需要把圖片進行序列化(可以存儲可以傳輸的數據)為二進制的字節流傳到服務器

js 中提供的序列化方法是表單數據序列化new FoemData() 表單數據序列化,需要把控件放入表單里,form 表單要是能夠識別到控件的值的話,控件需要加 name屬性值

<form class='imgbox'><input type='file' class='file' name='file'>
</form>

此外 new FormData() 是 javascript 中原生的方法只對 dom 元素起作用,需要把 jdom 元素轉為 dom 元素

var value = new FormData($(".imgbox")[0])

請求成功我們打印 value,看一下輸出結果
在這里插入圖片描述

發現 value 實際是個對象,這時我們獲取該控件的值,使用 value.get("file")

$(".file").change(function(){var value = new FormData($(".imgbox")[0])console.log(value.get("file"))

我點擊控件操作了兩次,第一次上傳圖片,第二次并沒有上傳圖片而是點擊了取消,打印結果如下:

在這里插入圖片描述

從圖中可以看出上傳圖片和上傳空的區別,發現上傳圖片的 name 部分有該圖片的名稱,而上傳空的 name 部分為空,如此我們便可以通過 imgbox.get("file").name 來判斷用戶是否上傳了圖片

因此前端發起請求代碼:

在這里插入圖片描述
upload 后端代碼:

	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// TODO Auto-generated method stub//設置請求和響應的編碼格式req.setCharacterEncoding("utf-8");resp.setContentType("text/json;charset=UTF-8"); resp.setCharacterEncoding("utf-8");//表單String realFileName="";//核心ApiFileItemFactory factory = new DiskFileItemFactory();ServletFileUpload fileUpload = new ServletFileUpload(factory);//判斷是否是muitipart/form-data類型if(!ServletFileUpload.isMultipartContent(req)) {//resp.getWriter().println("表單的enctype屬性不是multipart/form-data類型");System.out.println("表單的enctype屬性不是multipart/form-data類型");return;}//設置單個文件上傳大小fileUpload.setFileSizeMax(8*1024*1024); //設置總上傳文件大小fileUpload.setSizeMax(60*1024*1024);//解析請求try {List<FileItem> parseRequest = fileUpload.parseRequest(req);//獲取數據for (FileItem fileItem : parseRequest) {//判斷數據類型是不是普通的form表單字段if(!fileItem.isFormField()) {//上傳文件String fileName = fileItem.getName();InputStream fileStream = fileItem.getInputStream();//定義保存的父路徑(服務器部署的真實路徑)String parentDir = this.getServletContext().getRealPath("/upload");//定義絕對路徑//String parentDir = "D:\\eclipse-workspace-new\\myWish\\WebContent\\upload";//使用UUID+文件名的方式,避免文件重名realFileName = UUID.randomUUID().toString()+"-"+fileName;//創建要保存的文件File file = new File(parentDir,realFileName);//判斷文件夾是否存在if(!file.getParentFile().exists()) {//創建文件夾[多級文件夾]file.madir是創建單一文件夾file.getParentFile().mkdirs();}//創建輸出流OutputStream out = new FileOutputStream(file);//創建字節緩存byte[] buffer = new byte[1024];int len = -1;//一次讀取1kb(1024byte),返回-1表明讀取完畢while((len = fileStream.read(buffer))!=-1) {//一次寫入1kb(1024byte)out.write(buffer,0, len);}System.out.println(realFileName);//沖刷流資源out.flush();//關閉流out.close();fileStream.close();}}} catch (FileUploadException e) {e.printStackTrace();}//反饋信息String json="";if(realFileName!=null && !"".equals(realFileName)) {json = "{\"msg\":\"上傳成功\",\"imgurl\":\""+realFileName+"\"}";}else {json = "{\"msg\":\"上傳失敗\"}";}resp.getWriter().print(json);}
}

此時我們上傳圖片后,控制臺信息打印報錯:

在這里插入圖片描述

這是因為我們上傳圖片 ajax 請求需要額外添加兩個配置contenType:falseprocessData:false

其中 contenType 默認是 true 指的是文本,設置 false 那么指的是前端給后端的數據是非文本格式processData 默認是 true 指的是以對象形式上傳的數據會被轉換為字符串,設置 false 那么指的是以對象形式上傳的數據不會被轉換為字符串
加入以上兩個配置信息后,即可成功上傳圖片,再次上傳圖片后的打印信息如下:

在這里插入圖片描述

此時我們查看服務器項目部署目錄 C:\Users\HP\eclipse-workspace.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\web\upload 中的內容:

在這里插入圖片描述

上傳到服務器成功!

上傳的圖片在該頁面中顯示

我們想實現上傳圖片后能夠在下面看到上傳的是哪張圖片的功能

首先需要在HTML中添加容器來放照片:

<div class='show'></div>

請求成功我們需要在該容器中放入控件中上傳的照片,將該標簽元素內部的HTML內容替換為圖片元素,該圖片的src屬性需要指向圖片上傳到服務器的項目部署目錄 ‘upload/’ 下的圖片文件

$(".show").html("<img src='upload/"+value.imgurl+"'>")

我們想要從圖片上傳函數中獲取到在服務器上的圖片信息名稱 value.imgurl 再放入到添加函數的參數域中傳給后端,后端加入到數據庫中。
由于前面打印過 (".file").val(),控件的值是該圖片在客戶端電腦上的路徑,不能設置該控件的值只能獲取該控件的值,且圖片上傳函數和添加函數是分開的兩個函數,imgurl只在請求成功的value域中起效果。

針對這種情況現有兩種解決辦法:
解決辦法1:將取到的 imgurl 設置為全局變量
解決辦法2:添加 hidden 隱藏域

下面我們使用解決辦法2:
在該頁面的HTML中添加 hidden 隱藏域,前端看不到該區域但標簽確實是存在的

<input type='hidden' class='imgurl'>

圖片上傳函數中請求成功后讓該隱藏域獲取到 value.imgurl 信息

success:function(value){$(".show").html("<img src='upload/"+value.imgurl+">")$(".imgurl").val(value.imgurl)
}

前端上傳圖片后,在前端頁面中找到該標簽,如下,獲取到了,這樣我們就能在一個頁面(html標簽值)中得到上傳圖片的信息了
在這里插入圖片描述

前端圖片上傳函數,需要將 hidden 隱藏域攜帶上:
在這里插入圖片描述
前端添加函數,獲取 hidden 隱藏域中的值即可得到圖片信息:
在這里插入圖片描述

數據庫中還需要添加 imgurl 字段

后端添加servlet代碼:

在這里插入圖片描述

修改界面代碼

HTML:

<body>
修改
<div class='updateModel'>
姓名:<input type='text' class='name'><br><br>
性別:<input type='text' class='sex'><br><br>
年齡:<input type='number' class='age'><br><br>
頭像:
<form class='imgbox'><input type='file' class='file' name='file'>
</form><br>
<input type='hidden' class='imgurl'>
<div class='show'></div><br>	
班級:
<select class='classid'><option value='1'>軟件一班</option><option value='2'>軟件二班</option><option value='3'>大數據</option><option value='4'>人工智能</option>
</select><br><br><br>自我介紹:<!-- 加載編輯器的容器 --><script id="container" name="content" type="text/plain"></script><!-- 配置文件 --><script type="text/javascript" src="utf8-jsp/ueditor.config.js"></script><!-- 編輯器源碼文件 --><script type="text/javascript" src="utf8-jsp/ueditor.all.js"></script><!-- 實例化編輯器 --><input type='button' class='update' value='修改'>
</div>
</body>

js:

$(function(){//實例化編輯器var ue = UE.getEditor('container');//展示var id = $.cookie("id")$.ajax({url:"SearchById",type:"get",data:{id},success:function(value){var obj = value.data[0]$(".name").val(obj.name)$(".sex").val(obj.sex)$(".age").val(obj.age)$(".classid").val(obj.classid)$(".imgurl").val(obj.imgurl)$(".show").html("<img src='upload/"+obj.imgurl+"' style='width:250px;height:200px;object-fit:cover'>")ue.ready(function(){var introduce = ue.setContent(obj.introduce)})}})//圖片上傳 change值改變事件$(".file").change(function(){//表單數據序列化var imgbox = new FormData($(".imgbox")[0])if(imgbox.get("file").name){$.ajax({url:"upload",type:"post",data:imgbox,contentType:false,//非文本格式processData:false,success:function(value){console.log(value)$(".show").html("<img src='upload/"+value.imgurl+"' style='width:250px;height:200px;object-fit:cover'>")$(".imgurl").val(value.imgurl)}})}})//修改$(".update").click(function(){var name = $(".name").val()var sex = $(".sex").val()var age = $(".age").val()var classid = $(".classid").val()var introduce = ue.getContent()var imgurl = $(".imgurl").val()$.ajax({url:"UpdateServlet",type:"post",data:{name,sex,age,classid,id,introduce,imgurl},success:function(value){alert(value)location.href="index.html"}})})
})

后端:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");String name = request.getParameter("name");String sex = request.getParameter("sex");String age = request.getParameter("age");String classid = request.getParameter("classid");String id = request.getParameter("id");String introduce = request.getParameter("introduce");introduce = introduce.replace("\"", "\'");String imgurl = request.getParameter("imgurl");String sql = "update student set name = \""+name+"\",age = "+age+",sex = \""+sex+"\",classid = "+classid+",introduce=\""+introduce+"\",imgurl=\""+imgurl+"\" where id = "+id;int num = MysqlUtil.update(sql);String res = "修改失敗";if(num>0) {res="修改成功";}response.getWriter().write(res);	
}

最終實現效果

在這里插入圖片描述
在添加頁面和修改頁面都有上面圖片的效果,可以上傳圖片并且下面會展示上傳圖片的縮略圖。但在添加頁面選擇圖片點擊后再添加按鈕,該圖片會被數據庫記錄,在修改頁面選擇圖片后再點擊修改按鈕,數據庫會修改記錄。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/89585.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/89585.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/89585.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【PTA數據結構 | C語言版】多叉堆的上下調整

本專欄持續輸出數據結構題目集&#xff0c;歡迎訂閱。 文章目錄題目代碼題目 請編寫程序&#xff0c;將 n 個已經滿足 d 叉最小堆順序約束的數據直接讀入最小堆&#xff1b;隨后將下一個讀入的數據 x 插入堆&#xff1b;再執行刪頂操作并輸出刪頂的元素&#xff1b;最后順次輸…

selenium后續!!

小項目案例:實現批量下載網頁中的資源根據15.3.2小節中的返回網頁內容可知,用戶只有獲取了網頁中的圖片url才可以將圖片下載到*在使用selenium庫渲染網頁后,可直接通過正則表達式過濾出指定的網頁圖片&#xff0c;從而實現批量下載接下來以此為思路來實現一個小項目案例。項目任…

深度解析Linux文件I/O三級緩沖體系:用戶緩沖區→標準I/O→內核頁緩存

在Linux文件I/O操作中&#xff0c;緩沖區的管理是一個核心概念&#xff0c;主要涉及用戶空間緩沖區和內核空間緩沖區。理解這兩者的區別和工作原理對于高效的文件操作至關重要。 目錄 一、什么是緩沖區 二、為什么要引入緩沖區機制 三、三級緩沖體系 1、三級緩沖體系全景圖…

【每日算法】專題十三_隊列 + 寬搜(bfs)

1. 算法思路 BFS 算法核心思路 BFS&#xff08;廣度優先搜索&#xff09;使用 隊列&#xff08;Queue&#xff09;按層級順序遍歷圖或樹的節點。以下是 C 實現的核心思路和代碼模板&#xff1a; 算法框架 #include <queue> #include <vector> #include <un…

【動手實驗】發送接收窗口對 TCP傳輸性能的影響

環境準備 服務器信息 兩臺騰訊云機器 t04&#xff08;172.19.0.4&#xff09;、t11&#xff08;172.19.0.11&#xff09;&#xff0c;系統為 Ubuntu 22.04&#xff0c;內核為 5.15.0-139-generic。默認 RT 在 0.16s 左右。 $ ping 172.19.0.4 PING 172.19.0.4 (172.19.0.4) …

28、鴻蒙Harmony Next開發:不依賴UI組件的全局氣泡提示 (openPopup)和不依賴UI組件的全局菜單 (openMenu)、Toast

目錄 不依賴UI組件的全局氣泡提示 (openPopup) 彈出氣泡 創建ComponentContent 綁定組件信息 設置彈出氣泡樣式 更新氣泡樣式 關閉氣泡 在HAR包中使用全局氣泡提示 不依賴UI組件的全局菜單 (openMenu) 彈出菜單 創建ComponentContent 綁定組件信息 設置彈出菜單樣…

讓老舊醫療設備“聽懂”新語言:CAN轉EtherCAT的醫療行業應用

在醫療影像設備的智能化升級中&#xff0c;通信協議的兼容性常成為工程師的“痛點”。例如&#xff0c;某醫院的移動式X射線機采用CAN協議控制機械臂&#xff0c;而主控系統基于EtherCAT架構。兩者協議差異導致數據延遲高達5ms&#xff0c;影像定位精度下降&#xff0c;甚至影響…

ubuntu基礎搭建

ubuntu上docker的搭建 https://vulhub.org/zh 網站最下面找到開始使用&#xff0c;有搭建的命令//安裝docker&#xff0c;連接失敗多試幾次 curl -fsSL https://get.docker.com | sh //驗證Docker是否正確安裝&#xff1a; docker version //還要驗證Docker Compose是否可用&am…

動態規劃 + DFS + 記憶化!Swift 解 LeetCode 329 的實戰筆記

文章目錄摘要描述題解答案題解代碼分析代碼解析示例測試及結果時間復雜度空間復雜度總結摘要 這篇文章帶你用 Swift 實戰一道非常經典的 DFS 記憶化搜索題目 —— LeetCode 329《矩陣中的最長遞增路徑》。看似一個簡單的“走格子”游戲&#xff0c;實則考察了搜索順序、剪枝策…

046_局部內部類與匿名內部類

一、局部內部類&#xff08;Local Inner Class&#xff09; 1.1 定義與基本概念 局部內部類是定義在方法、構造器或代碼塊內部的類&#xff0c;其作用域僅限于所在的局部范圍&#xff08;定義它的方法、構造器或代碼塊&#xff09;&#xff0c;超出該范圍則無法訪問。 它的核心…

Jenkins Pipeline 中使用 JsonSlurper 報錯:cannot find current thread

Jenkins Pipeline 中使用 JsonSlurper 報錯&#xff1a;cannot find current thread&#x1f31f; 背景? 問題重現&#x1f9e0; 原因解析&#xff1a;CPS 與非 CPS 安全方法沖突? 解決方案一&#xff1a;使用 NonCPS 注解&#xff08;經典方案&#xff09;? 解決方案二&…

Go 語言循環語句詳解

Go 語言循環語句詳解 在編程語言中&#xff0c;循環語句是實現重復執行某些代碼塊的關鍵元素。Go 語言作為現代編程語言之一&#xff0c;提供了多種循環結構來滿足不同的編程需求。本文將詳細講解 Go 語言中的循環語句&#xff0c;包括 for、while 和 goto 語句&#xff0c;幫助…

day30——零基礎學嵌入式之進程間通信1.0

一、進程間通信7種方式1.傳統的進程間通信方式&#xff08;1&#xff09;管道①無名管道&#xff1a;②有名管道&#xff1a;&#xff08;2&#xff09;③信號&#xff08;3&#xff09;system Ⅴ 》系統Ⅴ 進程間通信方式 inner Process Comunication④共享內存 &#xff…

408考研逐題詳解:2010年第33題——網絡體系結構

2010年第33題 下列選項中&#xff0c;不屬于網絡體系結構所描述的內容是&#xff08; &#xff09; A. 網絡的層次 \qquad B. 每層使用的協議 \qquad C. 協議的內部實現細節 \qquad D. 每層必須完成的功能 解析 本題屬于計算機網絡基礎知識的范疇&#xff0c;考查網絡體系結構…

VR 遠程系統的沉浸式協作體驗?

在傳統的遠程協作中&#xff0c;團隊成員往往通過二維的視頻畫面進行交流&#xff0c;這種方式雖然能實現基本的溝通&#xff0c;但缺乏真實感和互動性。而 VR 遠程系統的出現&#xff0c;徹底改變了這一局面。戴上 VR 設備&#xff0c;員工們仿佛置身于同一個真實的辦公室空間…

記錄DataGrip 2025.1.3破解失敗后,無法重啟問題修復

記錄DataGrip 2025.1.3破解失敗后&#xff0c;無法重啟問題修復安裝過程復盤異常場景解決方式總結安裝過程 在官網下載了最新版本2025.1.3。安裝成功后&#xff0c;使用30天試用方式&#xff0c;打開datagrip。 復盤異常場景 網上搜索破解教程進行破解。找了一個需要現在ja…

私有服務器AI智能體搭建配置選擇記錄

在搭建私有服務器上的AI智能體時&#xff0c;需要從多個方面進行選擇和規劃&#xff0c;以確保系統性能、安全性、可擴展性等方面滿足需求。1. 硬件選擇 服務器配置&#xff1a; CPU&#xff1a;選擇高性能多核CPU&#xff08;如Intel Xeon或AMD EPYC系列&#xff09;&#xff…

SDC Specical check setting的描述 - false path

在上一篇文中描述了SDC的基本語法&#xff0c;其中關于時序異常約束并沒有進行詳細的描述&#xff0c;但是在正常的設計中&#xff0c;一般這種異常的設置反而是需要特別關注的&#xff0c;主要包括&#xff1a;1. 虛假路徑- false path不需要滿足任何時序要求的路徑&#xff1…

【Python練習】048. 編寫一個函數,實現簡單的命令行接口,接受用戶輸入并響應

048. 編寫一個函數,實現簡單的命令行接口,接受用戶輸入并響應 在 Python 中,可以通過 input() 函數創建一個簡單的命令行接口,接受用戶輸入并根據輸入內容進行響應。 示例代碼 def simple_command_line_interface():"""實現一個簡單的命令行接口,接受用…

軟件工廠語境下的知識系統選型:兼顧合規性與集成深度

在過去幾十年間&#xff0c;制造業從“工匠手作”邁向“工業流水線”&#xff0c;完成了生產效率的巨大飛躍。當軟件開發也面臨交付復雜性、合規要求與協作成本不斷上升的現實&#xff0c;“軟件工廠”的理念逐步興起。 在這場“開發現代化”的轉型中&#xff0c;知識管理被重新…