使用Servlet、datatable实现简单的文件上传
遇到的坑:
1,前端jsp页面无法读取js、和css(一直是404状态)
原因,一开始也许js文件夹里只有一两个js文件,idea编译之后,如果你再次添加js文件,则找不到,此时需要删除target文件夹,重新编译即可。同样,navicat在添加完数据以后要记得刷新一下,以上错误都是平台自身更新不及时的问题。
2,
效果图:
前端实现:
1)index
<%--
Created by IntelliJ IDEA.
User: 13218
Date: 2021/11/2
Time: 14:02
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" import="java.util.*" %>
<%@ page import="java.io.PrintWriter" %>
<%@ page import="jdk.nashorn.internal.ir.debug.JSONWriter" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
// System.out.println(path);
// System.out.println(basePath);
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<%-- base是定义相对路径的,这样显示图片之类的就可以省事一些--%>
<base href="<%=basePath%>">
<title>My JSP 'fileupload.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<title>Title</title>
</head>
<body>
<!-- enctype 默认是 application/x-www-form-urlencoded -->
<form action="/FileUpLoad" enctype="multipart/form-data" method="post" >
设备ID: <input type="text" name="ID"> <br/>
设备名称:<input type="text" name="name"><br/>
本次数量:<input type="text" name="number"><br/>
生产日期: <input type="date" name="time"><br/>
上传文件:<input type="file" name="file1"><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
2)datatable需要做的修改
datatable配置属性非常多,但是网上的博主其实没有说得很清楚,比如如何在ajax访问之后展示数据,以及每个数据的渲染都没有。所以还是要看官方文档http://datatables.club/(虽然它又臭又长)
贴一个局部:
"aoColumns": [{"mRender": function(data, type, full) {
sReturn = '<input type="checkbox" class="checkboxes" value="'+data+'"/>';
return sReturn;
},"orderable": false},{data:4,
render:function (data,type,row){
return '<a href="'+data+'" target="_blank">下载</a>';}},{data:0},{data:1},{data:2},{data:3}
],
后端实现:
FileUpLoad.java
package Servlet;
import db.DB;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.json.JSONObject;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.sql.SQLException;
import java.util.List;
public class FileUpLoad extends HttpServlet {
//doPost整体是为了上传文件和文件属性准备的
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8"); //设置编码
//写入数据库~
DB db = new DB();
String file_path="" ;//前端访问路径
String file_url="";//本地物理路径
long data_length = 0;//数据字节长度
String size = "";//数据大小,为了便于识别,我们将字节转KB、MB
//获得磁盘文件条目工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//获取文件需要上传到的路径
String path = "E:\\Grade3\\mobile_programming\\week10\\FileUpload\\src\\main\\webapp\\file";
//如果没以下两行设置的话,上传大的 文件 会占用 很多内存,
//设置暂时存放的 存储室 , 这个存储室,可以和 最终存储文件 的目录不同
/**
51. * 原理 它是先存到 暂时存储室,然后在真正写到 对应目录的硬盘上,
52. * 按理来说 当上传一个文件时,其实是上传了两份,第一个是以 .tem 格式的
53. * 然后再将其真正写到 对应目录的硬盘上
54. */
factory.setRepository(new File(path));
//设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室
factory.setSizeThreshold(1024*1024) ;
//高水平的API文件上传处理
ServletFileUpload upload = new ServletFileUpload(factory);
try {
//可以上传多个文件
//不过这里注意,前端请求方式是multipart/form-data和post,所以用request.parameter无法读取
//表单的name属性,在这里的list中,实际上包含了文件和其余属性
List<FileItem> list = (List<FileItem>)upload.parseRequest(request);
for(FileItem item : list)
{
//获取表单的属性名字
String name = item.getFieldName();
//如果获取的 表单信息是普通的 文本 信息或者是input属性值
if(item.isFormField())
{
//这里是将上传内容名称编码为utf8,找了很久转码格式,这么看来multipart/form-data上传的编码是ISO-8859-1
//这里是把穿上来的内容反编译为字节码,再用utf-8编译
String value = new String(item.getString().getBytes("ISO-8859-1"),"utf-8");
}
//对传入的非 简单的字符串进行处理 ,比如说二进制的 图片,电影这些
else
{
/**
84. * 以下三步,主要获取 上传文件的名字
85. */
//获取路径名
String value = item.getName() ;
System.out.println("路径名:"+value);
//索引到最后一个反斜杠
int start = value.lastIndexOf("\\");
//截取 上传文件的 字符串名字,加1是 去掉反斜杠,
String filename = value.substring(start+1);
file_path = "/file/"+filename;
file_url = path+file_path;
//真正写到磁盘上
//它抛出的异常 用exception 捕捉
//item.write( new File(path,filename) );//第三方提供的
//手动写的
OutputStream out = new FileOutputStream(new File(path,filename));
InputStream in = item.getInputStream() ;
int length = 0 ;
byte [] buf = new byte[1024] ;
System.out.println("获取上传文件的总共的容量:"+item.getSize());
data_length = item.getSize();//单位是字节
if(data_length>1024){
size += data_length/1024 +"K";
}
if(data_length>1048576){
size += data_length/1048576+"M";
}
// in.read(buf) 每次读到的数据存放在 buf 数组中
while( (length = in.read(buf) ) != -1)
{
//在 buf 数组中 取出数据 写到 (输出流)磁盘上
out.write(buf, 0, length);
}
in.close();
out.close();
}
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (Exception e) {
// TODO Auto-generated catch block
//e.printStackTrace();
}
try {
//传到数据库处理
db.upload( (String) request.getAttribute("ID"),
(String) request.getAttribute("name"),
(String) request.getAttribute("number")
,(String) request.getAttribute("time")
, file_path, file_url, size);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
//重定向,重定向以后,request、response不会刷新,可以传值
request.getRequestDispatcher("filedemo.jsp").forward(request, response);
}
@Override
//doGet是为了显示已经上传了的文件
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
DB db = new DB();
List res = db.show();
JSONObject jsonObject = new JSONObject();
jsonObject.put("message","ok");
jsonObject.put("data",res);
System.out.println(res);
System.out.println(jsonObject);
//注意哈,utf-8
response.setContentType("text/html;charset=utf-8");
response.getWriter().print(jsonObject);
response.getWriter().flush();
response.getWriter().close();
}
}
DB.java
package db;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class DB {
public void upload(String id,String device_name,String number,String time
,String file_path,String file_url,String size) throws SQLException {
System.out.println("开始数据库!");
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException classnotfoundexception) {
classnotfoundexception.printStackTrace();
}
try {
//注意:数据表video_file确保在test数据库下面,如果没有就导入进去,或者放在自己建的数据库,下面的test相应要修改
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?user=&password=&useUnicode=true&characterEncoding=UTF-8");
Statement statement = conn.createStatement();
System.out.println("连接数据库Ok!!!");
String sql = "insert into device_file(device_id,device_name,number,create_time," +
"file_path,file_url,size) values ("+"'"+id+"'"+","+"'"+device_name+"'"+","+number+","+
"'"+time+"'"+","+"'"+file_path+"'"+","+"'"+file_url+"'"+","+"'"+size+"'"+")";
System.out.println(sql);
statement.execute(sql);
statement.close();
conn.close();
System.out.println("数据库关闭了!!!");
return;
}catch (SQLException sqlexception) {
sqlexception.printStackTrace();
}
}
public List<List<String>> show(){
//开始查询数据库
//注意:如果遇到问题,Tomcat的日志在C:\Tomcat\logs\stdout.log,可以查看
List jsonList = new ArrayList();
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException classnotfoundexception) {
classnotfoundexception.printStackTrace();
}
try {
//注意:数据表video_file确保在test数据库下面,如果没有就导入进去,或者放在自己建的数据库,下面的test相应要修改
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?user=&password=&useUnicode=true&characterEncoding=UTF-8");
Statement statement = conn.createStatement();
//构造sql语句,根据传递过来的查询条件参数,目前是deviceId和gpsTime
String sql = "select * from device_file where size>0 ";
System.out.println("构造出来的sql语句是:" + sql);
ResultSet rs = statement.executeQuery(sql);
while (rs.next()) {
List list = new ArrayList();
list.add(rs.getString("device_id"));
list.add(rs.getString("device_name"));
list.add(rs.getString("create_time"));
list.add(rs.getString("size"));
list.add(rs.getString("file_path"));
jsonList.add(list);
}
statement.close();
conn.close();
System.out.println("数据库关闭了!!!");
} catch (SQLException sqlexception) {
sqlexception.printStackTrace();
}
return jsonList;
}
}
文件目录(利好小白)