如何使用datatable、简单Servlet实现文件的上传展示

使用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;

    }
    }

文件目录(利好小白)
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是 C# 中读写 CSV 文件使用 `DataTable` 相互转换的示例代码: ```csharp using System; using System.Data; using System.IO; class Program { static void Main(string[] args) { // 读取 CSV 文件DataTable DataTable dataTable = new DataTable(); using (var reader = new StreamReader(@"C:\data.csv")) { while (!reader.EndOfStream) { var line = reader.ReadLine(); var values = line.Split(','); // 第一行数据作为列名 if (dataTable.Columns.Count == 0) { foreach (var value in values) { dataTable.Columns.Add(value.Trim()); } } else { // 处理每行数据 DataRow row = dataTable.NewRow(); for (int i = 0; i < values.Length; i++) { row[i] = values[i].Trim(); } dataTable.Rows.Add(row); } } } // 将 DataTable 写入 CSV 文件 using (var writer = new StreamWriter(@"C:\output.csv")) { // 写入列名 for (int i = 0; i < dataTable.Columns.Count; i++) { writer.Write(dataTable.Columns[i]); if (i < dataTable.Columns.Count - 1) { writer.Write(","); } } writer.WriteLine(); // 写入数据 foreach (DataRow row in dataTable.Rows) { for (int i = 0; i < dataTable.Columns.Count; i++) { writer.Write(row[i].ToString()); if (i < dataTable.Columns.Count - 1) { writer.Write(","); } } writer.WriteLine(); } } Console.WriteLine("CSV 文件读取和写入完成!"); } } ``` 在这个示例代码中,我们使用 `StreamReader` 类来读取指定路径下的 CSV 文件使用 `DataTable` 类来保存读取到的数据,同时将其转换为 `DataTable` 对象。我们遍历读取到的每行数据,并将第一行数据作为列名,将每行数据添加到 `DataTable` 中。接着我们使用 `StreamWriter` 类来创建一个新的 CSV 文件,并将 `DataTable` 对象中的数据写入到文件中。最后,程序输出一条消息表示 CSV 文件操作完成。 如果需要在程序中使用 `DataTable` 对象进行数据处理,可以使用以下代码将 `DataTable` 转换为 CSV 文件: ```csharp // 将 DataTable 写入 CSV 文件 using (var writer = new StreamWriter(@"C:\output.csv")) { // 写入列名 for (int i = 0; i < dataTable.Columns.Count; i++) { writer.Write(dataTable.Columns[i]); if (i < dataTable.Columns.Count - 1) { writer.Write(","); } } writer.WriteLine(); // 写入数据 foreach (DataRow row in dataTable.Rows) { for (int i = 0; i < dataTable.Columns.Count; i++) { writer.Write(row[i].ToString()); if (i < dataTable.Columns.Count - 1) { writer.Write(","); } } writer.WriteLine(); } } ``` 这段代码将 `DataTable` 的列名和每行数据写入到 CSV 文件中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值