解析上传文件所遇到的问题
一、数据库应该放些什么
数据库中不应该存放音频、图片、视频等大型文件,而是应该储存他们的存放地址,存放这些的东西的时候,应该把他们的地址放到数据库中,再从数据库服务器中得到他们存放的地址(路径),然后返回给浏览器,浏览器再利用此地址访问该视频。
二、如何上传文件
首先,要在web工程下建一个与WEB-INF同级的文件夹,用来储存资源文件,接下来就要交给代码啦。
1)jsp页面
填写表单信息,提交给服务器
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
Created by IntelliJ IDEA.
User: lenovo
Date: 2022/2/22
Time: 20:49
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>上传歌曲</title>
</head>
<body>
<center>
<h1>File Upload to Database Demo</h1>
<form method="post" action="uploadServlet" enctype="multipart/form-data">
<table border="0">
<tr>
<td>主题:</td>
<td><input type="text" name="title" size="50"/></td>
</tr>
<tr>
<td>歌手:</td>
<td><input type="text" name="singer" size="50"/></td>
</tr>
<tr>
<td>歌名:</td>
<td><input type="text" name="song" size="50"/></td>
</tr>
<tr>
<td>类型:</td>
<td><input type="text" name="type"/></td>
</tr>
<tr>
<td>歌曲:</td>
<td><input type="file" name="music" size="50"/></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="Save">
</td>
</tr>
</table>
</form>
</center>
</body>
</html>
2)servlet进行处理(数据库储存相对路径)
@WebServlet("/uploadServlet")
//配置上传文件的大小
@MultipartConfig(maxFileSize = 16177215 * 100)
public class FileUploadDBServlet extends HttpServlet {
protected void doPost(HttpServletRequest req,
HttpServletResponse resp) throws ServletException, IOException {
//设置字符集
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
//获取表单信息
String title = req.getParameter("title");
String singer = req.getParameter("singer");
String song = req.getParameter("song");
String type = req.getParameter("type");
String url = null;
Connection conn = null;
String message = null;
User user = new User();
PreparedStatement pst = null;
final String PATH = "static";
try {
//利用集合储存文件
List<String> list = new ArrayList<>();
//获取上传文件进行储存
Collection<Part> parts = req.getParts();
for (Part p : parts) {
//获取文件名
String fileName = p.getSubmittedFileName();
//判断是否为空,去除空异常
if (fileName != null && fileName.length() > 0) {
list.add(fileName);
//将文件以相同文件名写到规定的路径
p.write(PATH + fileName);
}
url = PATH + "/" + fileName;
System.out.println(url);
}
//连接数据库
conn = JdbcUtils.getConnect();
String sql = "INSERT INTO music (title,singer,music,song,type) values (?,?,?,?,?)";
pst = conn.prepareStatement(sql);
pst.setString(1, title);
pst.setString(2, singer);
pst.setString(3, url);
pst.setString(4, song);
pst.setString(5, type);
//查看数据是否更新
int row = pst.executeUpdate();
if (row > 0) {
message = "成功插入";
}
} catch (SQLException ex) {
ex.printStackTrace();
} finally {
JdbcUtils.close(null, pst, conn);
req.setAttribute("Message", message);
//将req中储存的信息传递到下一个页面
req.getRequestDispatcher("/Message.jsp").forward(req, resp);
}
}
}
/*
*executeQuery执行 SELECT 语句
*executeUpdate执行 INSERT、UPDATE 或 DELETE 语句,
*execute,两者都可,而且能返回多个ResultSet对象
*
*/
三、总结
经过这一段时间的学习与实战,我对于servlet、jsp、jstl标签库都有了更加深刻的理解,明白了如何携带信息跳转页面,获取登录信息,也懂得了该如何将他们运用到实战中去,希望在接下来的学习中能做的更好,加油!