如题。
主要功能是:实现单张上传、验证重复、向数据库里面插入记录。
一、首先是前端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;
}
}
图片插入结束后,跳转回本页面。