上传图片到数据库的两种方法

思路

不管是用form方式还是ajax方式提交,原理都是在后台新建一个文件夹专门放图片/文件,把文件的名字存到数据库中

通过form提交

html部分:input框type选file,enctype选multipart/form-data(用二进制方式传输)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<div style="width:50%;margin: 0 auto;padding:100px;">
		<form action="/WebNewLearn/UploadServlet2" method="post" enctype="multipart/form-data">
			<input type="file" name="file">
			<input type="submit">
		</form>
	</div>
</body>
</html>

servlet部分:步骤:先定义两个变量存储图片的名字和路径,判断数据传输的方式是否是二进制类型,如果不是,直接返回。
设置文件大小,多个文件的总大小,监听器等
把request请求拆解开放到一个集合里,然后遍历该集合
如果某一个元素是图片/文件类型,先获取到它的名字,创建图片所存放的文件夹,给图片名字加一个随机数,然后定义一个输入流,把图片内容读取到流中,(注意判断文件夹是否存在),创建一个空文件。
创建一个输出流,把图片内容输入到文件中,关闭流
如果元素不是图片,直接记录内容
把内容和图片的标题存储到数据库中
如果是jsp形式可以用

	request.setAttribute("data", showUtil);
	request.getRequestDispatcher("FirstJsp.jsp").forward(request, response);

的形式来跳转和传输数据

package com.MyNewLearn.web;

import java.io.IOException;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import com.MyNewLearn.db.MysqlUtil;

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

/** * Servlet implementation class UploadServlet */
@WebServlet("/UploadServlet2")
public class UploadServlet2 extends HttpServlet { 
	private static final long serialVersionUID = 1L;
       
    /** * @see HttpServlet#HttpServlet() */
    public UploadServlet2() { 
        super();
        // TODO Auto-generated constructor stub
    }

	/** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
		// TODO Auto-generated method stub
		 //设置请求和响应的编码格式
		req.setCharacterEncoding("utf-8");
		resp.setContentType("text/html;charset=UTF-8"); 
		resp.setCharacterEncoding("utf-8");
        
		//表单
		String myFile = "";
		String parentDir="";
		
        //核心Api
        FileItemFactory 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;
        }
        
        //设置单个文件上传大小 8M
        fileUpload.setFileSizeMax(8*1024*1024); 
        //设置总上传文件大小(有时候一次性上传多个文件,需要有一个上限,此处为60M)
        fileUpload.setSizeMax(60*1024*1024);
        //设置上传监听器[参数为自定义的监听器]
       // fileUpload.setProgressListener(new ListenerUploadProgress());
        //解析请求
        try { 
        	//把request拆解开放到list集合里
            List<FileItem> parseRequest = fileUpload.parseRequest(req);
            //获取数据
            for (FileItem fileItem : parseRequest) { 
                //判断数据类型是不是普通的form表单字段
                if(!fileItem.isFormField()) { 
                    //上传文件
                    String fileName = fileItem.getName();
                    InputStream fileStream = fileItem.getInputStream();
                    //定义保存的父路径(服务器部署相对的绝对路径)
                    parentDir = this.getServletContext().getRealPath("/upload");
                    //定义绝对路径
                    //String parentDir = "D:\\eclipse-workspace-new\\myWish\\WebContent\\upload";
                    //使用UUID+文件名的方式,避免文件重名
                    String 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(parentDir);
                    System.out.println(realFileName);
                    myFile = realFileName;
                    //冲刷流资源
                    out.flush();
                    //关闭流
                    out.close();
                    fileStream.close();
                    
                }else { 
                    //普通字段
                    
                    //字段名
                    String fieldName = fileItem.getFieldName();
                    //字段值中文乱码
                    String fieldValue = fileItem.getString("UTF-8");
                    
                    
                    System.out.println(fieldName+":"+fieldValue);
                }
            }
        } catch (FileUploadException e) { 
            e.printStackTrace();
        } 
        
		if(!myFile.equals("")) { 
			String sql1 = "insert into img(imgUrl) values(\""+myFile+"\")";
			int flag = MysqlUtil.update(sql1);
		}	
		
	}

}

jsp页面遍历结果

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isELIgnored="false"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE html> <html> <head> <meta charset="ISO-8859-1"> <title>Insert title here</title> </head> <body> <script> function (){ 
		var url=window.location.href;
		alert(url.split("?")[1].split("=")[1]);
		//url.split是指把该字符串分割,以参数为界限,分割成数组
	}
</script> <table border="1"> <tr> <th>编号</th> <th>标题</th> <th>分类</th> <th>作者</th> <th>内容摘要</th> <th>操作</th> </tr> <!-- c标签用于遍历 ${ data}代表从servlet定义的数据 --> <c:forEach items="${ data}" var="d"> <tr> <th>${ d[0]}</th> <th>${ d[1]}</th> <th>${ d[2]}</th> <th>${ d[3]}</th> <th>${ d[4]}</th> <th>${ d[5]}</th>
	       </tr>  	
       </c:forEach>
	</table>
</body>
</html>

ajax部分

三个重点:

		1.把所有需要传输的数据放到一个form然后封装到一个对象中   var data = new FormData($("#myForm")[0]);
		2.设置属性:contentType:false
        3.设置属性:processData: false
$("#add").click(function(){ 
		var username = $("#username").val();
		var age = $("#age").val();
		var info = $("#info").val();
		var createDate = $("#createDate").val();
		var dept = $("#dept").val();
		var myfile = $("#myfile").val();
		var data = new FormData($("#myForm")[0]); if(username!=""&&myfile!=""&&age!=""&&info!=""&&createDate!=""){ 
			//loading层 var index1 = layer.load(0, { 
			  shade: [0.2,'#000'] //0.1透明度的白色背景
			}); $.ajax({ 
				url:"/myWish/UploadServlet", async:true, type:"post", data:data, // data:{ 
// 					"username":username,
// 					"age":age,
// 					"info":info,
// 					"createDate":createDate,
// 					"myfile":myfile,
// 					"dept":dept
// 				}, contentType:false, processData: false, success:function(data){ 	
					if(data==1){ 
						layer.close(index1)
						init();		
						$("#username").val("");
						$("#age").val("");
						$("#info").val("");
						$("#createDate").val("");
						$("#myfile").val("");
					}
					else{ 
						layer.close(index1) layer.alert("添加失败",{ icon: 2});
					}
				}, error:function(error){ 
					layer.close(index1) layer.alert("请求失败",{ icon: 2});
				}
			})
		}else{ 
			layer.msg("信息没有输入完全")
		}
		
	})

    原文作者:残·影
    原文地址: https://blog.csdn.net/Walker7143/article/details/105495109
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞