这篇文章主要为大家详细介绍了JavaWeb实现简单上传文件功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了JavaWeb实现上传文件功能的具体代码,供大家参考,具体内容如下
基本思想:网站服务器的内部除了有Web应用,还有文件系统,客户端向网站上传文件就是将文件以流的形式传输给了服务器,如图所示:
注意事项:
1、为保证服务器的安全,上传的文件路径应放在外界不能直接访问的目录下,比如WEB-INF目录下。
2、因为服务器的文件系统大小有限,上传的文件大小必须要有限制。
3、为防止因为文件名重复而导致文件覆盖,应当给上传的文件夹生成唯一的标识,比如时间戳、UUID或者md5加密。
4、可以限制上传文件的类型,在收到文件的时候,判断文件后缀是否合法。
在JavaWeb中,一般我们使用ServletFileUpload类来处理上传的文件数据,它使用parseRequest方法将表单的每一个输入项封装成一个FileItem对象,并以list的形式返回,处理数据比较简短,方便。
下面是一个上传文件的小demo,编辑器是IDEA,项目类型是Maven Webapp。
package com.xiaojing.servlet;
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 javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.List;
import java.util.UUID;
public class FileUploadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//判断表单是普通表单,还是上传文件表单
if(!ServletFileUpload.isMultipartContent(req)){
return;
}
//创建上传文件的路径,一般放在/WEB-INF下,比较安全
String uploadPath = this.getServletContext().getRealPath("/WEB-INF/upload");
File uploadFile = new File(uploadPath);
if(!uploadFile.exists()){
uploadFile.mkdir();
}
//如果上传的文件大小超过了限制,那么会将这个文件放在临时文件夹,过段时间提醒用户删除或者转为永久
String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");
File tempFile = new File(tempPath);
if(!tempFile.exists()){
tempFile.mkdir();
}
//1、创建DiskFileItemFactory对象
DiskFileItemFactory factory = new DiskFileItemFactory();
//2、获取ServletFileUpload对象
ServletFileUpload upload = new ServletFileUpload();
upload.setFileItemFactory(factory);
//3、处理上传文件
//将前端请求封装成Fileitem对象,每一个表单输入项都是一个Fileitem对象
try {
List<FileItem> items = upload.parseRequest(req);
for (FileItem item: items) {
if(item.isFormField()){ //如果是普通的表单
//getFieldName()是input的name属性,getString()是input的value属性
String fieldName = item.getFieldName();
String value = item.getString("UTF-8");
System.out.println(fieldName + ":" +value);
}else{ //上传文件的表单
//---------------处理文件------------------//
String uploadFileName = item.getName();
System.out.println("上传的文件名:"+uploadFileName);
if(uploadFileName == null || uploadFileName.trim().equals("")){
continue;
}
//获取fileName文件名,uploadFileName一般是url/文件路径/文件
String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("\\")+1);
//获取文件后缀
String fileExt = uploadFileName.substring(uploadFileName.lastIndexOf(".")+1);
System.out.println("文件信息:"+fileName);
//---------------处理地址-----------------//
//使用UUID唯一标识存放文件夹
String uuidPath = UUID.randomUUID().toString();
//获取真实的文件夹地址
String realPath = uploadPath + "/" + uuidPath;
File realFile = new File(realPath);
if(!realFile.exists()){
realFile.mkdir();
}
//---------------处理文件流-----------------//
//获取文件上传的流
InputStream inputStream = item.getInputStream();
//创建一个文件输出流
FileOutputStream outputStream = new FileOutputStream(realFile + "/" + fileName);
//创建一个缓冲区
byte[] buffer = new byte[1024 * 1024];
int len = 0;
while((len = inputStream.read(buffer)) > 0){ //每次读写1M
outputStream.write(buffer,0,len);
}
outputStream.close();
inputStream.close();
String msg = "文件上传成功";
System.out.println("文件上传成功");
//清除临时文件
item.delete();
//转发
req.setAttribute("msg",msg);
req.getRequestDispatcher("index.jsp").forward(req,resp);
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程学习网。
本文标题为:JavaWeb实现简单上传文件功能
基础教程推荐
- JDK数组阻塞队列源码深入分析总结 2023-04-18
- java基础知识之FileInputStream流的使用 2023-08-11
- Java文件管理操作的知识点整理 2023-05-19
- springboot自定义starter方法及注解实例 2023-03-31
- Java实现查找文件和替换文件内容 2023-04-06
- Java数据结构之对象比较详解 2023-03-07
- Java并发编程进阶之线程控制篇 2023-03-07
- java实现多人聊天系统 2023-05-19
- ConditionalOnProperty配置swagger不生效问题及解决 2023-01-02
- Java实现线程插队的示例代码 2022-09-03