最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java編程之如何通過(guò)JSP實(shí)現(xiàn)頭像自定義上傳

 更新時(shí)間:2022年12月19日 07:51:32   作者:Tonytom  
之前做這個(gè)頭像上傳功能還是花了好多時(shí)間的,今天我將我的代碼分享給大家,下面這篇文章主要給大家介紹了關(guān)于Java編程之如何通過(guò)JSP實(shí)現(xiàn)頭像自定義上傳的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

開發(fā)概述

本次項(xiàng)目意在實(shí)現(xiàn)一種可以在本地選擇圖片,然后將其上傳至服務(wù)器指定文件目錄下,并可以通過(guò)服務(wù)器自動(dòng)生成的臨時(shí)鏈接下載到本地的指定目錄進(jìn)行保存,這樣數(shù)據(jù)庫(kù)就只需要存儲(chǔ)對(duì)應(yīng)圖片的文件名即可進(jìn)行正常的顯示,以達(dá)到上傳圖片的目的。

開發(fā)環(huán)境

整體使用了Maven的開發(fā)環(huán)境   數(shù)據(jù)庫(kù)操作使用的是Mybatis進(jìn)行管理   前臺(tái)頁(yè)面的顯示操作則是通過(guò)jsp+servlet   數(shù)據(jù)庫(kù)采用mysql數(shù)據(jù)庫(kù)

開發(fā)過(guò)程

1、JSP前臺(tái)頁(yè)面

首先你需要在你的jsp頁(yè)面中準(zhǔn)備好一個(gè)圖片上傳的<form>表單,一開始<input> 標(biāo)簽中的value值可以先設(shè)置為默認(rèn)值,到后面連接好數(shù)據(jù)庫(kù),寫好servlet之后再進(jìn)行替換,這里就不在具體展示過(guò)程了,直接一步到位。另外本次舉例的具體呈現(xiàn)的效果樣式如下圖所示:

 <div class="modal modal-profile" style="display: none;">
   <div class="hd"><h4 class="tt" style="margin-left: 10px;">我的資料</h4><a id="a_close" class="close">×</a></div>
    <div class="bd">

        <form class="form-horizontal" action="../usersInfo.do" method="post" enctype="multipart/form-data">
            <div class="avatar"><img id="showupimg" src="img/upload/image/<%=usersInfo.getUava()%>" alt="頭像">
                <a class="upload">點(diǎn)擊更換</a><input id="uploadimg" type="file" name="file" accept="image/png, image/jpeg, image/gif, image/jpg" class="upload-input">
                <input type="hidden" name="uname" value="<%=usersInfo.getUname()%>"/>
            </div>
            <div class="form-group"><label class="control-label">昵稱</label>
                <div class="control-form"><input name="unname" type="text" placeholder="請(qǐng)輸入昵稱" class="form-control" value="<%=usersInfo.getUnname()%>"><!----></div>
            </div>
            <div class="form-group"><label class="control-label">簽名</label>
                <div class="control-form">
                    <textarea name="signview" rows="5" placeholder="請(qǐng)輸入簽名,字?jǐn)?shù)不超過(guò)100字" class="form-control"><%=usersInfo.getUpersonal()%></textarea>
                </div>
            </div>
            <div class="ft">
                <input type="submit" id="btn_save" class="btn btn-primary" value="保存"/>
                <button type="button" id="btn_cancel" class="btn btn-default">取消</button>
            </div>
        </form>
    </div>

樣式圖:

JS操作

本來(lái)這里想通過(guò)ajax來(lái)完成的,因?yàn)橥ㄟ^(guò)servlet重定向會(huì)頁(yè)面時(shí),頁(yè)面總會(huì)閃一下,影響了用戶體驗(yàn),但是由于趕時(shí)間,就沒(méi)有把它改成ajax,以后有時(shí)間的話可能會(huì)補(bǔ)一段,現(xiàn)在先這樣吧。

    $("#uploadimg").change(function () {

        var url, imgbase64;

        //獲取file對(duì)象URL
        if (navigator.userAgent.indexOf("MSIE") >= 1) { // IE
            url = document.getElementById('uploadimg').value;
        } else if (navigator.userAgent.indexOf("Firefox") > 0) { // Firefox
            url = window.URL.createObjectURL(document.getElementById('uploadimg').files.item(0));
        } else if (navigator.userAgent.indexOf("Chrome") > 0) { // Chrome
            url = window.URL.createObjectURL(document.getElementById('uploadimg').files[0]);
        }

        // 創(chuàng)建Image對(duì)象
        var image = new Image();
        image.src = url;
        image.onload = function () {
            imgbase64 = getBase64Image(image);
            $("#showupimg").attr("src",image.src);
        }

    });

2、數(shù)據(jù)庫(kù)的設(shè)計(jì)

關(guān)于數(shù)據(jù)庫(kù)表做的其實(shí)還是比較簡(jiǎn)單的,我做的其實(shí)是分了兩個(gè)表,一個(gè)Users表,一個(gè)UsersInfo表。Users表用來(lái)存放用戶的賬號(hào)、密碼和登錄時(shí)間;UsersInfo表用來(lái)存儲(chǔ)對(duì)應(yīng)用戶的用戶信息,如昵稱、頭像、性別、年齡等等,這里Users表用不到,所以只展示了UsersInfo表。

數(shù)據(jù)庫(kù)表:

實(shí)體類:UsersInfo.java

package com.skdsc.domain.login;

public class UsersInfo {
    private String uname;
    private String unname;
    private Sex usex;
    private String uage;
    private String uava;
    private String uqq;
    private String upersonal;

    public UsersInfo() {
    }

    public UsersInfo(String uname, String unname, Sex usex, String uage, String uava, String uqq, String upersonal) {
        this.uname = uname;
        this.unname = unname;
        this.usex = usex;
        this.uage = uage;
        this.uava = uava;
        this.uqq = uqq;
        this.upersonal = upersonal;
    }

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public String getUnname() {
        return unname;
    }

    public void setUnname(String unname) {
        this.unname = unname;
    }

    public Sex getUsex() {
        return usex;
    }

    public void setUsex(Sex usex) {
        this.usex = usex;
    }

    public String getUage() {
        return uage;
    }

    public void setUage(String uage) {
        this.uage = uage;
    }

    public String getUava() {
        return uava;
    }

    public void setUava(String uava) {
        this.uava = uava;
    }

    public String getUqq() {
        return uqq;
    }

    public void setUqq(String uqq) {
        this.uqq = uqq;
    }

    public String getUpersonal() {
        return upersonal;
    }

    public void setUpersonal(String upersonal) {
        this.upersonal = upersonal;
    }
}

3、數(shù)據(jù)庫(kù)操作

這里用到的數(shù)據(jù)庫(kù)操作主要是兩個(gè):findByUserInfoName()updateUsersInfo()

UsersMapper

import com.skdsc.domain.login.Users;
import com.skdsc.domain.login.UsersInfo;
import org.apache.ibatis.annotations.Param;

public interface UsersMapper {
    Users findByUserName(@Param("parUserName") String parUserName);
    UsersInfo findByUsersInfoName(@Param("parUserName") String parUserName);
    int updateUtime(@Param("uname") String uname,@Param("newUtime") String newUtime);
    int updateUsersInfo(@Param("uname") String uname,@Param("newUnname") String newUnname,@Param("newUpersonal") String newUpersonal,@Param("newUava") String newUava);
}

UsersMapper.xml

<mapper namespace="com.skdsc.mappers.login.UsersMapper">

    <sql id="selStr">uid,uname,upwd,utime</sql>
    <sql id="selStr1">uname,unname,uage,usex,uava,uqq,upersonal</sql>

    <resultMap id="newUsersInfo" type="com.skdsc.domain.login.UsersInfo">
        <result property="uname" column="uname"/>
        <result property="unname" column="unname"/>
        <result property="uage" column="uage"/>
        <result property="uava" column="uava"/>
        <result property="uqq" column="uqq"/>
        <result property="upersonal" column="upersonal"/>
        <!--嵌套對(duì)象標(biāo)簽-->
        <association property="usex" javaType="com.skdsc.domain.login.Sex">
            <id property="sid" column="sid"/>
            <result property="sname" column="sname"/>
        </association>
    </resultMap>

    <!-- 根據(jù)學(xué)號(hào)查詢用戶表 -->
    <select id="findByUserName" resultType="com.skdsc.domain.login.Users">
        SELECT <include refid="selStr" /> FROM Users where uname = #{parUserName,jdbcType=VARCHAR}
    </select>
    <!-- 根據(jù)學(xué)號(hào)查詢用戶信息表 -->
    <select id="findByUsersInfoName" resultType="com.skdsc.domain.login.UsersInfo">
        SELECT <include refid="selStr1" /> FROM UsersInfo where uname = #{parUserName,jdbcType=VARCHAR}
    </select>
    <!-- 更新最近一次的登錄時(shí)間 -->
    <update id="updateUtime">
         UPDATE Users SET utime = #{newUtime} where uname = #{uname}
    </update>
    <!-- 更新個(gè)人資料(頭像、昵稱、個(gè)人簽名) -->
    <update id="updateUsersInfo">
        UPDATE UsersInfo <trim prefix="set" suffixOverrides=",">
        <if test="newUnname !=null">unname = #{newUnname},</if>
        <if test="newUpersonal !=null">upersonal = #{newUpersonal},</if>
        <if test="newUava !=null">uava = #{newUava}</if>
    </trim>
        WHERE uname = #{uname}
    </update>
</mapper>

4、Servlet

這里主要是先獲取<form>表單提交上來(lái)的數(shù)據(jù),對(duì)數(shù)據(jù)進(jìn)行處理,獲得其路徑以及文件后綴,并利用年月日時(shí)分秒+8位隨機(jī)數(shù)生成一個(gè)新的文件名,最后通過(guò)DownloadImage工具類中的download方法將圖片下載到本地的指定目錄。

import static com.lazy.servlet.utils.DownloadImage.download;
import static com.lazy.servlet.utils.TimeRandom.createOrderCode;

@WebServlet("/usersInfo.do")
@MultipartConfig
public class UsersInfoAction extends HttpServlet {

    private static final long serialVersionUID = 1L;
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        String unname = request.getParameter("unname");
        String upersonal = request.getParameter("signview");
        String uname = request.getParameter("uname");
        System.out.println(unname + upersonal + uname);
        try {
            //設(shè)置基礎(chǔ)路徑
            String basePath = "http://localhost:8080/smartcampus_web_war/center/img/upload/image/";

            //獲取上傳的文件
            Part part = request.getPart("file");

            //獲取請(qǐng)求的信息
            String name=part.getHeader("content-disposition");

            //獲取上傳文件的目錄
            String root=request.getServletContext().getRealPath("/center/img/upload/image");
            System.out.println("測(cè)試上傳文件的路徑:"+root);

            //獲取文件的后綴
            String str=name.substring(name.lastIndexOf("."), name.length()-1);
            System.out.println("測(cè)試獲取文件的后綴:"+str);

            //生成一個(gè)新的文件名,不重復(fù),數(shù)據(jù)庫(kù)存儲(chǔ)的就是這個(gè)文件名,不重復(fù)的
            String filename=root+"\\"+createOrderCode()+str;
            System.out.println("測(cè)試產(chǎn)生新的文件名:"+filename);

            //獲取上傳到本地服務(wù)器的圖片路徑
            String strimg = filename.substring(filename.lastIndexOf("\\")+1);
            String imgsrc = basePath + strimg;

            System.out.println("測(cè)試獲取圖片名稱:"+strimg);

            //上傳文件到指定目錄,不想上傳文件就不調(diào)用這個(gè)
            part.write(filename);

            //下載到本地指定目錄
            download(imgsrc, strimg,"E:\\Studyspaces\\Intellij IDEA\\IdeaProjects\\sk170403\\smartcampus_web\\src\\main\\webapp\\center\\img\\upload\\image");


            SqlSession sqlSession = MybatisUtil.getSqlSession();
            UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
            int updateUsersInfoflag = usersMapper.updateUsersInfo(uname,unname,upersonal,strimg);
            if (updateUsersInfoflag != 0){
                sqlSession.commit();
            }else {
                sqlSession.rollback();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        response.sendRedirect("center/zfcenter.jsp");

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

5、工具類

DownloadImage:下載指定路徑下的文件到本地指定目錄

package com.lazy.servlet.utils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;

public class DownloadImage {
    /**
     * @param args
     * @throws Exception
     */

    public static void download(String urlString, String filename,String savePath) throws Exception {
        // 構(gòu)造URL
        URL url = new URL(urlString);
        // 打開連接
        URLConnection con = url.openConnection();
        //設(shè)置請(qǐng)求超時(shí)為5s
        con.setConnectTimeout(5*1000);
        // 輸入流
        InputStream is = con.getInputStream();

        // 1K的數(shù)據(jù)緩沖
        byte[] bs = new byte[1024];
        // 讀取到的數(shù)據(jù)長(zhǎng)度
        int len;
        // 輸出的文件流
        File sf=new File(savePath);
        if(!sf.exists()){
            sf.mkdirs();
        }
        OutputStream os = new FileOutputStream(sf.getPath()+"\\"+filename);
        // 開始讀取
        while ((len = is.read(bs)) != -1) {
            os.write(bs, 0, len);
        }
        // 完畢,關(guān)閉所有鏈接
        os.close();
        is.close();
    }
}

TimeRandom:生成年月日時(shí)分秒+8位隨機(jī)數(shù)

package com.lazy.servlet.utils;

import java.text.SimpleDateFormat;
import java.util.Date;

public class TimeRandom {
    private static String getNowDate(){
        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
        return simpleDateFormat.format(date);
    }
    private static String getRandom(){
        String rand = "";
        for (int i = 0; i < 8; i++){
            rand = rand + (int)(Math.random()*10);
        }
        return rand;

    }
    public static String createOrderCode(){
        String OrderCode = getNowDate() + getRandom();
        return OrderCode;
    }
}

6、最終效果展示

總結(jié)

到此這篇關(guān)于Java編程之如何通過(guò)JSP實(shí)現(xiàn)頭像自定義上傳的文章就介紹到這了,更多相關(guān)Java JSP頭像自定義上傳內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • jdk21安裝后無(wú)jre文件該如何解決

    jdk21安裝后無(wú)jre文件該如何解決

    java開發(fā)少不了安裝jdk,下面這篇文章主要給大家介紹了關(guān)于jdk21安裝后無(wú)jre文件該如何解決的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • 解決mybatis-plus自定義xml的坑

    解決mybatis-plus自定義xml的坑

    這篇文章主要介紹了解決mybatis-plus自定義xml的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • GSON實(shí)現(xiàn)Java對(duì)象與JSON格式對(duì)象相互轉(zhuǎn)換的完全教程

    GSON實(shí)現(xiàn)Java對(duì)象與JSON格式對(duì)象相互轉(zhuǎn)換的完全教程

    GSON是Google編寫并在在GitHub上開源的Java序列化與反序列化JSON的類庫(kù),今天我們就來(lái)總結(jié)一下使用GSON實(shí)現(xiàn)Java對(duì)象與JSON格式對(duì)象相互轉(zhuǎn)換的完全教程
    2016-06-06
  • mybatis Example的Criteria用法:or與isNull詳解

    mybatis Example的Criteria用法:or與isNull詳解

    這篇文章主要介紹了mybatis Example的Criteria用法:or與isNull詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 使用Java生成32位16進(jìn)制密鑰的代碼實(shí)現(xiàn)

    使用Java生成32位16進(jìn)制密鑰的代碼實(shí)現(xiàn)

    在許多加密和安全應(yīng)用中,生成隨機(jī)的密鑰是至關(guān)重要的一步,密鑰通常以16進(jìn)制形式表示,并且具有特定的長(zhǎng)度,在這篇博客中,我們將探討如何使用Java生成一個(gè)32位長(zhǎng)度的16進(jìn)制密鑰,并展示詳細(xì)的代碼示例和運(yùn)行結(jié)果,需要的朋友可以參考下
    2024-08-08
  • Java實(shí)戰(zhàn)之課程在線學(xué)習(xí)系統(tǒng)的實(shí)現(xiàn)

    Java實(shí)戰(zhàn)之課程在線學(xué)習(xí)系統(tǒng)的實(shí)現(xiàn)

    本文將采用SpringBoot+Spring+Mybatis+Thyeleaf實(shí)現(xiàn)一個(gè)課程在線學(xué)習(xí)系統(tǒng),采用SpringBoot框架實(shí)現(xiàn)?前臺(tái)模板用的thymeleaf數(shù)據(jù)庫(kù)層采用mybatis框架注解模式,感興趣的可以了解一下
    2022-04-04
  • Java基礎(chǔ)之垃圾回收機(jī)制詳解

    Java基礎(chǔ)之垃圾回收機(jī)制詳解

    這篇文章主要介紹了Java基礎(chǔ)之垃圾回收機(jī)制詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • java面試LruCache?和?LinkedHashMap及算法實(shí)現(xiàn)

    java面試LruCache?和?LinkedHashMap及算法實(shí)現(xiàn)

    這篇文章主要為大家介紹了java面試LruCache?和?LinkedHashMap及算法實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Java計(jì)算程序代碼執(zhí)行時(shí)間的方法小結(jié)

    Java計(jì)算程序代碼執(zhí)行時(shí)間的方法小結(jié)

    這篇文章主要介紹了Java計(jì)算程序代碼執(zhí)行時(shí)間的方法,結(jié)合實(shí)例形式總結(jié)分析了java采用毫秒數(shù)及納秒數(shù)計(jì)算程序運(yùn)行時(shí)間的相關(guān)操作技巧,需要的朋友可以參考下
    2017-11-11
  • 使用redisTemplate從redis獲取所有數(shù)據(jù)

    使用redisTemplate從redis獲取所有數(shù)據(jù)

    這篇文章主要介紹了使用redisTemplate從redis獲取所有數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06

最新評(píng)論

孟连| 平潭县| 虞城县| 阜康市| 泾川县| 澄城县| 鄂托克前旗| 民丰县| 开鲁县| 山丹县| 桂阳县| 济宁市| 罗江县| 台前县| 饶阳县| 古蔺县| 肇州县| 太白县| 龙南县| 综艺| 眉山市| 马鞍山市| 商水县| 图片| 罗田县| 巴东县| 东丽区| 乌兰县| 微山县| 南华县| 梅河口市| 永靖县| 安图县| 海淀区| 宜州市| 拜泉县| 深州市| 凉山| 安庆市| 泰和县| 黔江区|