实现图片单张上传

如题。
主要功能是:实现单张上传、验证重复、向数据库里面插入记录。
一、首先是前端jsp:
(使用的是Bootstrap框架,只包含图片上传部分代码)
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML>
<html>
<head>
    <meta name="content-type" content="text/html";charset="UTF-8">
    <!-- 格式 -->
    <%@include file="/WEB-INF/page/common.jsp" %>
</head>

<body>
<div style='width:50%;height:350px;'>
            <form onsubmit="return ftp_submit();" action="../UploadServlet" method="post" enctype="multipart/form-data" style='padding-top:30px;'>
                <div class='form-group' style='width:50%;height:150px;float:left;position:relative;'> 
                    <label style='position:absolute;z-index:50;width:100%;height:150px;box-sizing:border-box;padding:0 10px 0 20px;' for='ftp_image'><img id='ftp_imgg' src='' style='width:100%;height:100%;border:1px #ccc solid;'></label>
                    <input class='hide' style='position:absolute;z-index:50;float:left;width:70%;margin-top:4px;' id='ftp_image' type="file" name="image" onchange="previewImage(this,'imgPreviewId')"><br>
                </div>
                <div class='form-group' style='width:50%;height:150px;position:relative;float:left;' >
                    <div id='ftp_show1' class='hide' style='position:absolute;z-index:40;box-sizing:border-box;padding:0 20px 0 10px;width:100%;height:150px;'>
                        <img  style='border:1px #ccc solid;background:#fff;box-sizing:border-box;width:100%;height:150px;' alt="" src="" name="srcImage" id="imgPreviewId">
                    </div>
                    <div id='ftp_show2' class='' style='position:absolute;z-index:40;box-sizing:border-box;padding:0 20px 0 10px;width:100%;height:150px;'>
                        <span class='' style='line-height:150px;text-align:center;font-size:30px;color:#ccc;float:left;border:1px #ccc solid;box-sizing:border-box;width:100%;height:150px;'>图片展示区</span>
                    </div>
                </div>
                <div class='form-group' style='clear:both;box-sizing:border-box;padding:0 20px;width:100%;height:34px;position:relative;'>
                    <input placeholder='输入4-10位由数字或字母或下划线组成的名称(image)' onKeypress='press(event)'  onKeydown='press1(event)'  onKeyup='press2(event)' style='float:left;width:100%;' id='ftp_name' class='form-control' type="text" name="name">
                    <span id='ftp_verification'  style='color:#f00;font-size:12px;line-height:34px;position:absolute;right:6%;top:34px;'></span>
                 </div>
                <div class='btn_group' style='position:relative;width:120px;height:34px;clear:both;left:50%;margin-left:-60px;' >
                    <input type="submit" value="上传" style='text-align:center;width:54px;height:34px;float:left;border: 1px solid transparent;border-radius: 4px;background: #476dbe;color: #fff;'> 
                    <span onclick='close_ftpimg()' id='close_ftp' style='margin-left:8px;text-align:center;width:54px;height:34px;float:left;border: 1px solid #ccc;border-radius: 4px;background: #fff;color: #303030;line-height:34px;'>取消</span>
                </div>
            </form>
    </div>
</body>
<script type="text/javascript" src="../upload.js"></script>
<html>

jsp中主要是处理了样式,布局的规范性,

二、js中主要是进行验证,包括验证文件扩展名、浏览器版本的验证、输入名称的验证(项目中插入的图片样式名称记录需要入库,需保证不重复)以及不允许为空等等。
代码如下(js):
// 去左空格
function ltrim(s) {
    return s.replace(/^\s*/, "");
}
// 去右空格
function rtrim(s) {
    return s.replace(/\s*$/, "");
}
// 去左右空格
function trim(s) {
    return rtrim(ltrim(s));
}
// 获取文件扩展名
function get_ext(f_path) {
    var ext = '';
    if (f_path != null && trim(f_path).length > 0) {
        f_path = trim(f_path);
        ext = f_path.substring(f_path.lastIndexOf(".") + 1, f_path.length);
    }
    return ext;
}
// 验证文件扩展名
function chk_ext(f_path) {
    var ext = get_ext(f_path);
    // 根据需求定制
    var accept_ext = new Array( "bmp", "jpeg", "jpg", "gif","png");
    var flag = false;
    if (ext != '') {
        for ( var i = 0; i < accept_ext.length; i++) {
            if (ext == accept_ext[i])
                flag = true;
        }
    }
    return flag;
}

/*★★★★★★★★★★★★★★★★★★★*/

//js本地图片预览,兼容ie[6-8]、火狐、Chrome17+、Opera11+、Maxthon3
function PreviewImage1(fileObj,imgPreviewId,divPreviewId){
    var allowExtention="doc,pdf,bpm,jpeg,jpg,gif,ppt,xls";//document.getElementById("hfAllowPicSuffix").value;//.jpg,.bmp,.gif,.png,允许上传文件的后缀名
    var extention=fileObj.value.substring(fileObj.value.lastIndexOf(".")+1).toLowerCase();            
    var browserVersion= window.navigator.userAgent.toUpperCase();
    if(allowExtention.indexOf(extention)>-1){               
        if (browserVersion.indexOf("MSIE")>-1){
            if(browserVersion.indexOf("MSIE 6.0")>-1){//ie6
                document.getElementById(imgPreviewId).setAttribute("src",fileObj.value);
            }else{//ie[7-8]、ie9未测试
                fileObj.select();
                var newPreview =document.getElementById(divPreviewId+"New");
                if(newPreview==null){
                    newPreview =document.createElement("div");
                    newPreview.setAttribute("id",divPreviewId+"New");
                    newPreview.style.width = document.getElementById(imgPreviewId).style.width;
                    newPreview.style.height = document.getElementById(imgPreviewId).style.height;
                    newPreview.style.border="solid 1px #d2e2e2";
                }
                newPreview.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale',src='" + document.selection.createRange().text + "')";                            
                var tempDivPreview=document.getElementById(divPreviewId);
                tempDivPreview.parentNode.insertBefore(newPreview,tempDivPreview);
                tempDivPreview.style.display="none";                    
            }
        }else if(browserVersion.indexOf("FIREFOX")>-1){//firefox
            var firefoxVersion= parseFloat(browserVersion.toLowerCase().match(/firefox\/([\d.]+)/)[1]);
            if(firefoxVersion<7){//firefox7以下版本
                document.getElementById(imgPreviewId).setAttribute("src",fileObj.files[0].getAsDataURL());
            }else{//firefox7.0+                    
                document.getElementById(imgPreviewId).setAttribute("src",window.URL.createObjectURL(fileObj.files[0]));
            }
        }else if(fileObj.files){               
            //兼容chrome、火狐等,HTML5获取路径                   
            if(typeof FileReader !== "undefined"){
                var reader = new FileReader(); 
                reader.onload = function(e){
                    document.getElementById(imgPreviewId).setAttribute("src",e.target.result);
                } ; 
                reader.readAsDataURL(fileObj.files[0]);
            }else if(browserVersion.indexOf("SAFARI")>-1){
                alert("暂时不支持Safari浏览器!");
            }
        }else{
            document.getElementById(divPreviewId).setAttribute("src",fileObj.value);
        }         
    }else{
        alert("仅支持"+allowExtention+"为后缀名的文件!");
        fileObj.value="";//清空选中文件
        if(browserVersion.indexOf("MSIE")>-1){                        
            fileObj.select();
            document.selection.clear();
        }                
        fileObj.outerHTML=fileObj.outerHTML;
    }
}

function previewImage(fileObj,imgPreviewId) {
    console.log($('#ftp_image').val());
    /***********/
    if($('#ftp_image').val().length>0){
        $('#ftp_show1').removeClass('hide');
         $('#ftp_show2').addClass('hide'); 
    }else{
        $('#ftp_show1').addClass('hide');
         $('#ftp_show2').removeClass('hide'); 
    }


    /******/
    $('#ftp_name').focus().blur();
    var pic = document.getElementById(imgPreviewId),
        file = fileObj;
    var ext=file.value.substring(file.value.lastIndexOf(".")+1).toLowerCase();
    /***********/
    if($('#ftp_image').attr('src')!==''){
        $('#ftp_img').addClass('hide');
    }else{
        $('#ftp_img').removeClass('hide');
    }

    /*********/
     // gif在IE浏览器暂时无法显示
     if(ext!='png'&&ext!='jpg'&&ext!='jpeg'){
         layer.msg("图片的格式必须为png或者jpg或者jpeg格式!",{icon:2});
         $('#imgPreviewId').attr('src','');
         return;
     }
     var isIE = navigator.userAgent.match(/MSIE/)!= null,
         isIE6 = navigator.userAgent.match(/MSIE 6.0/)!= null;

     if(isIE) {
        file.select();
        var reallocalpath = document.selection.createRange().text;

        // IE6浏览器设置img的src为本地路径可以直接显示图片
         if (isIE6) {
            pic.src = reallocalpath;
         }else {
            // 非IE6版本的IE由于安全问题直接设置img的src无法显示本地图片,但是可以通过滤镜来实现
             pic.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='image',src=\"" + reallocalpath + "\")";
             // 设置img的src为base64编码的透明图片 取消显示浏览器默认图片
             pic.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==';
         }
     }else {
        html5Reader(file,imgPreviewId);
     }
}

 function html5Reader(file,imgPreviewId){
     var file = file.files[0];
     var reader = new FileReader();
     reader.readAsDataURL(file);
     reader.onload = function(e){
         var pic = document.getElementById(imgPreviewId);
         pic.src=this.result;
     };
}
 /******名称的验证******/
 function verification_con(){
     var regu='^[a-zA-Z0-9_]{4,10}$';
        var re=new RegExp(regu);
        var str_value='';
        $('#ftp_name').css('border-color','#f00');
        $('#ftp_verification').css('color','#f00');
        if(re.test($('#ftp_name').val())){
            /******需要传递的参数******/
        /***验证是否重复****/
        ftp_images_name=$('#ftp_name').val()+'.'+get_ext($('#ftp_image').val());
        var p={'name':$('#ftp_name').val(),'file':ftp_images_name}
        $.ajax({
            'url' : "/uploadController/whetherToRepeat.do",
            'type' : 'post',
            'contentType': "application/json",
            'data':JSON.stringify(p),
            'success' : function(data) {
                if(data){
                    $('#ftp_name').css('border-color','#0f0');
                    /**当不重复可以传值***/
                    $('#ftp_verification').css('color','#0f0');
                    str_value='输入的名称格式正确';
                }else{
                    str_value='输入的名称重复';
                }
                $('#ftp_verification').html(str_value);
            }

        });
        }else{
            if($('#ftp_name').val().length<4){
                str_value='输入的名称长度不足4位';
                $('#ftp_verification').html('');
            }else if($('#ftp_name').val().length>3&&$('#ftp_name').val().length<11){
                str_value='输入的格式不正确';
            }else if($('#ftp_name').val().length>10){
                str_value='输入的名称长度超过了10位';
            }
        }
        $('#ftp_verification').html(str_value);
 }
 $('#ftp_name').on('focus',function(){
    $('#ftp_name').css('border-color','#ccc');
    $('#ftp_verification').html('');
 })
  $('#ftp_name').on('blur',function(){
       if($('#ftp_name').val()==''){
         if($('#ftp_image').val()==''){
            $('#ftp_name').css('border-color','#f00');
            $('#ftp_verification').html('请选择图片').css('color','#f00');
         }else{
                var str_name=$('#ftp_image').val();
                var ftp_path_name='';
                for(var i=str_name.length-1;i>-1;i--){
                    if(!(str_name.charAt(i).indexOf('\\'))){
                        ftp_path_name=str_name.slice(i+1);
                        break;
                    }
                }
                ftp_path_name=ftp_path_name.slice(0,ftp_path_name.indexOf('.'));
                $('#ftp_name').val(ftp_path_name);
                verification_con();
         }
     }else{
         verification_con();
     }
 })

 /****上传之前的验证****/
function ftp_submit(){
     var value=false;
     if($('#ftp_verification').html()=='输入的名称格式正确'){
         if($('#imgPreviewId').attr('src')!=''){
             value=true;
         }

     }
     console.log(value);

     return value;
 }

/****input不允许输入空******/
function press(e){
    var event = e || event; 
    console.log(event.keyCode)
      if(event.keyCode == 32||event.keyCode == 190){
          event.preventDefault();  
          event.returnValue = false
        }
}
function press1(e){
    var event = e || event; 
    if(event.keyCode == 32||event.keyCode == 190){
          event.preventDefault();  
          event.returnValue = false
        }
}
function press2(e){
    var event = e || event; 
    if(event.keyCode == 32||event.keyCode == 190){
          event.preventDefault();  
          event.returnValue = false
        }
}

/***图片上传***/
$('#ftp_imgg').attr('src',basePath+'/images/ftp-img.jpg');
var ftp_index;
function showimagesftp(text){
    $('#imagesftp').removeClass('hide');
    ftp_index=layer.open({
        type: 1,
        title: text,
        shadeClose: true,
        shade: 0.8,
//        maxmin: true,
        area: ['50%', '350px'],
        closeBtn : 1,
        content : $("#imagesftp"),
        scrollbar: false,
        end:function(){ 
            /***清空图片上传内容****/
            $('#ftp_name').val('');
            $('#ftp_image').val('');
            $('#imgPreviewId').attr('src','');
            $('#ftp_img').removeClass('hide');
            $('#imagesftp').addClass('hide');
            $('#ftp_name').css('border-color','#ccc');
            $('#ftp_verification').html('');
            $('#ftp_show1').addClass('hide');
             $('#ftp_show2').removeClass('hide'); 
        }
    });
}
function close_ftpimg(){
    layer.close(ftp_index);
}

其中在验证名称是否重复时,用ajax去后台数据库里面进行查询,如果相同,则不允许插入,其前端js中代码如下:
(java代码中写一方法去数据库查询,作比较,返回布尔型值,判断是否重复,后台写法根据需要各异)

$.ajax({
            'url' : "/uploadController/whetherToRepeat.do",
            'type' : 'post',
            'contentType': "application/json",
            'data':JSON.stringify(p),
            'success' : function(data) {
                if(data){
                    $('#ftp_name').css('border-color','#0f0');
                    /**当不重复可以传值***/
                    $('#ftp_verification').css('color','#0f0');
                    str_value='输入的名称格式正确';
                }else{
                    str_value='输入的名称重复';
                }
                $('#ftp_verification').html(str_value);
            }

        });

三、在前端检查无误后,将会跳转到servlet去执行图片上传:
UploadServlet
实现图片上传,并将图片重命名,插入数据库,以便使用。

package com.dsg.dbmonitor.controller.dbmanager;


import java.io.IOException;
import java.io.InputStream;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.dsg.dbmonitor.utils.HttpUtil;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;


@MultipartConfig
@WebServlet(urlPatterns = "/UploadServlet", initParams = {})
public class UploadServlet extends HttpServlet{

    private static final long serialVersionUID = 1L;

    public UploadServlet() {
        super();
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");

        /*
        * 获取参数
        * 然后执行插入
        */
        String name = request.getParameter("name");
        String fileName = "";
        String path = request.getSession().getServletContext().getRealPath("/images/");

        fileName = HttpUtil.upload(request, "image", path,name);

        /*
         * 动态获取数据库配置文件的内容
         * 将刚插入的文件的记录放到数据库中
         */
        InputStream is = getClass().getResourceAsStream("/db.properties");
            Properties dbProps = null;
            try {
                dbProps = new Properties();
                dbProps.load(is);
            } catch(IOException e) {
                e.printStackTrace();
            }
            String ifSingle = dbProps.getProperty("jdbc.url");
            String conn_username = dbProps.getProperty("jdbc.username");
            String conn_pass = dbProps.getProperty("jdbc.password");
            String[] newifSingle = ifSingle.split("[?]");
            String newpath = newifSingle[0];
            System.out.println("查看参数"+ifSingle+"\n"+newpath+"\n"+conn_username+"\n"+conn_pass);


            String filePath = "images/";
            String css_path = filePath+fileName;
            String[] newStr = fileName.split("\\.");
            Date now = new Date();
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
            String creattime = dateFormat.format( now );

            Connection conn = null;
            PreparedStatement ps = null;
            try {
                conn = (Connection) DriverManager.getConnection(newpath,conn_username,conn_pass);
                ps = (PreparedStatement) conn.prepareStatement("INSERT INTO  sys_custom_css_tb (css_path,css_name,css_stat,create_time) VALUES (?,?,?,?)");
                ps.setObject(1, css_path);
                ps.setObject(2, newStr[0]);
                ps.setObject(3, "1");
                ps.setObject(4, creattime);
                ps.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            /*
             * 插入完成后,跳转会本页面
             */
            response.sendRedirect("loginManager/pageRedirect.do?menu=" + "sysmanager/custom_sql");

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

}

其中需要两个工具类
1。HttpUtil
获取原图片名称,做更改后,执行上传功能。
代码如下:

package com.dsg.dbmonitor.utils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.Part;

public class HttpUtil {

    public static String upload(HttpServletRequest request, String name, String upload_path ,String oldname)
            throws IOException, ServletException {
        // 获得文件路径和文件名
        String fileName = "";
        Part part = request.getPart(name);
        if (part != null) {
            String realName = getFileName(part);
            System.out.println(realName+"====realName");
            fileName = FileHelper.generateFileName(realName,oldname);

            // 执行文件上传
            if (!realName.equals("")) {
                File file = new File(upload_path, fileName);
                if (!file.exists()) {
                    file.createNewFile();
                }
                InputStream in = part.getInputStream();
                FileOutputStream out = new FileOutputStream(file);
                byte[] cache = new byte[256];
                int length = 0;
                while ((length = in.read(cache)) != -1) {
                    out.write(cache, 0, length);
                }
                out.flush();
                if (out != null) {
                    out.close();
                }
                if (in != null) {
                    in.close();
                }

            }

        }

        return fileName;

    }

    private static String getFileName(Part part) {
        String header = part.getHeader("Content-Disposition");
        String fileName = header.substring(header.indexOf("filename=\"") + 10, header.lastIndexOf("\""));
        header.lastIndexOf("\"");
        return fileName;
    }
}

2。FileHelper
主要功能是为插入的图片重命名,也可根据需求添加如计算大小等等
代码如下:

package com.dsg.dbmonitor.utils;


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

public final class FileHelper {

    public static String generateFileName(String fileName,String oldname) {
        System.out.println("这个name是个啥");
        System.out.println(fileName);
        DateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
        format.format(new Date());

        new Random().nextInt(10000);
        int position = fileName.lastIndexOf(".");
        String extension = fileName.substring(position);

        return oldname + extension;
    }

}

图片插入结束后,跳转回本页面。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值