JSP 文件上传
JSP 文件上传
在 web 应用程序中,文件上传是一项极其常见的功能。JSP 技术使我们能够轻松地实现文件上传,本文将详细介绍如何使用 JSP 完成文件上传。
浏览器上传文件的方式
我们早已习惯使用“浏览”按钮上传文件。实际上,在 HTML 等标记语言中使用 <input type="file">
创建一个文件上传窗口。当我们提交表单时,文件数据将通过 HTTP 协议以多部分表格形式发送,服务器就能知道这是一个文件上传请求。
JSP 实现文件上传
要在 JSP 页面中实现文件上传,我们需要在表单中添加 enctype
属性设置:
<form action="file-upload.jsp" method="post" enctype="multipart/form-data">
<input type="file" name="myfile">
<input type="submit" value="上传文件">
</form>
这样我们就可以将一个文件上传到服务器了。 JSP 接收到上传的文件时,可以通过 getParameter()
方法来获取表单项的值,例如:
String fileName = request.getParameter("myfile");
但是,在文件上传时,不能使用 getParameter()
方法来获取上传文件的内容。相反,我们需要使用以下步骤来接收文件:
-
创建
DiskFileItemFactory
的实例,它将被用来创建ServletFileUpload
类的对象。在创建DiskFileItemFactory
对象时,我们需要提供FileItemFactory
接口的实现类。 -
创建
ServletFileUpload
的实例。它是一个提供了文件上传功能的类。 -
解析上传的请求并获得所有表单项的列表。
-
实例化
FileItem
对象,并检查每个表单项,如果表单项是一个文件,则把它写到磁盘上,并把它的信息存储到数据库中。 -
在 JSP 页面中显示成功上传的信息。
以下是一个完整的文件上传示例代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="org.apache.commons.fileupload.*"%>
<%@ page import="org.apache.commons.fileupload.disk.*"%>
<%@ page import="org.apache.commons.fileupload.servlet.*"%>
<%@ page import="java.util.*"%>
<%@ page import="java.io.*"%>
<%@ page import="java.sql.*"%>
<%
String fileName = "";
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (isMultipart) {
//实例化DiskFileItemFactory对象,可以设置缓存参数
//默认的缓存路径是tomcat的temp文件夹下面的temp文件夹
DiskFileItemFactory factory = new DiskFileItemFactory();
// 创建一个 ServletFileUpload 对象
ServletFileUpload upload = new ServletFileUpload(factory);
//解决上传文件名的中文乱码问题
upload.setHeaderEncoding("utf-8");
//开始解析请求信息
List items = upload.parseRequest(request);
Iterator itr = items.iterator();
while (itr.hasNext()) {
FileItem item = (FileItem) itr.next();
//如果表单是文件上传控件
if (item.isFormField() == false) {
//获取文件名
fileName = item.getName();
//这里可以自己写,比如加上时间戳什么的
if (fileName != null) {
//获取上传文件的大小
int sizeInByte = (int) item.getSize();
// 获取文件的扩展名
String ext = fileName.substring(fileName.lastIndexOf(".") + 1);
//获取Web应用的服务端部署物理路径(也可以直接使用硬盘路径)
String serverPath = application.getRealPath("/") + "upload";
//如果路径不存在,新建路径
File folder = new File(serverPath);
if (!folder.exists()) {
if (folder.mkdir()) {
System.out.println("New directory has been created!");
} else {
System.out.println("Failed to create new directory!");
}
} else {
System.out.println("Directory already exists!");
}
//以日期创建新的文件名
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String newFileName = sdf.format(new java.util.Date()) + "." + ext;
//在上传的路径里面出新文件
File uploadedFile = new File(serverPath, newFileName);
try {
item.write(uploadedFile);
//将上传戳入数据库
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/test?user=root&password=root";
Connection con = DriverManager.getConnection(url);
Statement stm = con.createStatement();
String sql = "insert into test.upload_log values('" + sdf.format(new java.util.Date()) + "',"
+ sizeInByte + ",'" + fileName + "','" + uploadedFile.getAbsolutePath() + "')";
System.out.println(sql);
stm.execute(sql);
response.getWriter().println("已将文件上传至服务器的 " + uploadedFile.getAbsolutePath());
} catch (Exception e) {
response.getWriter().println("上传文件出现错误!");
e.printStackTrace();
}
}
}
}
} else {
response.getWriter().println("没有文件被上传!");
}
%>
总结
在 JSP 页面中使用文件上传功能确实很容易,只需添加一个表单控件和设置一些属性即可。然而,实现文件上传并不是一件简单的事情。对于大文件上传、速度慢或中途中断等问题,开发人员需要高度警惕。在部署上传文件的 Web 应用程序时,需要特别注意缓存路径是否正确、访问权限是否配置正确等问题。