1一1

类加载异常处理和文件上传

文件上传页面启动报500异常 说是类加载异常

以为是包导入问题 搜了一下 网上说是Tomcat服务器版本过高的问题 我本身也就7的版本 然后专门把jar包去maven仓库降级重新导入发现重新启动Tomcat还是有同样的问题 后来解决方法

右键lib包点Add as library

添加完之后记得去

project structure

这里面看看 然后重点来了

一定要看最下面的problems 里面会报一个提示 就是问你是否要把包也发布到项目中 不把这一步点了 在运行tomcat的时候 提示500错误 说类加载异常 找不到这个类 这个包就发布不到项目中去

 

 

----

导依赖包 commons-fileupload commons-io servlet-api jsp-api jstl-api

 

jsp页面设置


get: 上传文件大小有限制
post: 文件上传大小没有限制 所以一般用post

${pageContext.request.contextPath} 获取服务器当前路径
**enctype="multipart/form-data" 让文件支持上传属性**

```jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%--
get: 上传文件大小有限制
post: 文件上传大小没有限制
--%>

<%--${pageContext.request.contextPath} 获取服务器当前路径
enctype="multipart/form-data" 让文件支持上传属性--%>
<form action="${pageContext.request.contextPath}/upload.do" enctype="multipart/form-data" method="post">

上传用户:<input type="text" name="username"><br/>
<p><input type="file" name="file1"></p>
<p><input type="file" name="file2"></p>
<p>
<input type="submit"> | <input type="reset">
</p>



</form>


</body>
</html>
```

在info页面就取后端传递过来的attribute Session ${msg}

 

 

xml页面 这个自动创建的xml 的配置是最新的tomcat的 本来version是4.0 启动的时候有问题 tomcat启动不起来 然后去Tomcat文件中的root里面找了个页面 把配置信息更改了一下启动起来了

```xml
<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0"
metadata-complete="true">
<servlet>
<servlet-name>Fileup</servlet-name>
<servlet-class>com.shen.Fileup</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Fileup</servlet-name>
<url-pattern>/upload.do</url-pattern>
</servlet-mapping>
</web-app>
```

 

 

 

 

实现

1.创建一个servlet类

```java
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
//判断文件是普通的表单还是带文件的表单 这里条件是是普通表单
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/tmp");
File file = new File(tempPath);
if (!file.exists()){
file.mkdir();
}

DiskFileItemFactory factory = getDiskFileItemFactory(file); //调用工厂
ServletFileUpload upload = getServletFileUpload(factory);//调用文件上传 需要工厂的临时目录
String msg = uploadParseRequest(upload, req, uploadPath);//调用上传 吧前端解析
System.out.println(msg);
if (msg == "文件上传成功"){
req.setAttribute("msg",msg);
req.getRequestDispatcher("info.jsp").forward(req,resp);
}else{
msg="请上传文件";
req.setAttribute("msg",msg);
req.getRequestDispatcher("info.jsp").forward(req,resp);
}

 

} catch (FileUploadException e) {
e.printStackTrace();
}


}
```

 

2.需要一个工厂模式 来设置一个缓冲区 需要传参文件 这里面可以设置缓冲区大小以及存储的地方 不设置人家会有默认的方法

```java
//创建文件项目的工厂
public static DiskFileItemFactory getDiskFileItemFactory(File file){
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1024*1024); //设置缓冲区大小
factory.setRepository(file); //设置仓库 也就是存储的地方
return factory;
}

```

3.需要文件上传 这个需要传参工厂

```java

//文件上传 传入工厂
public static ServletFileUpload getServletFileUpload(DiskFileItemFactory factory){
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setProgressListener(new ProgressListener() {
@Override
public void update(long l, long l1, int i) {
System.out.println("总大小:"+l1+"已经上传:"+l+"进度:"+((double)l/l1)*100+"%");

}
});
upload.setHeaderEncoding("UTF-8");
upload.setFileSizeMax(1024*1024*10);//10M
return upload;

}
```

 

4. 把文件上传转换为请求 就是开始上传 传参上传 请求和上传地址

```java
public static String uploadParseRequest(ServletFileUpload upload, HttpServletRequest request, String uploadPath)
throws FileUploadException, IOException {
String msg = "";
//把前端请求解析为FileItem对象
List<FileItem> fileItems = upload.parseRequest(request);
for (FileItem fileItem : fileItems) {
if (fileItem.isFormField()) {
String name = fileItem.getFieldName();
String value = fileItem.getString("UTF-8"); //获取内容顺便处理乱码
System.out.println(name + ": " + value);
} else {
String uploadFileName = fileItem.getName();
System.out.println(uploadFileName + "上传文件名字");
//.trim是移除空格 就是怕用户输入带空格
if (uploadFileName.trim().equals("") || uploadFileName == null) {
continue;
}
String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1);
//文件类型 后缀名
String fileExtName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1);

System.out.println("文件名:" + fileName + "文件后缀" + fileExtName);
//生成一个uuid 随机名字
String uuidPath = UUID.randomUUID().toString();

//存东西路径
String realPath = uploadPath + "/" + uuidPath;

//给每个文件创建一个文件夹
File realFilePath = new File(realPath);
if (!realFilePath.exists()) {
realFilePath.mkdir();
}

//开始上传
//先把文件转换为流
InputStream inputStream = fileItem.getInputStream();

//然后要上传的流和地理位置
FileOutputStream fos = new FileOutputStream(realPath + "/" + fileName);

byte[] buffer = new byte[1024 * 1024];

int len = 0;
if ((len = inputStream.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
fos.close();
inputStream.close();

msg = "文件上传成功";
fileItem.delete();

}
}
return msg;
}
```

 

 

 

 

 

步骤:

1.先判断文件是否为文件类型 !ServletFileUpload.isMultipartContent(req)

不是表单的话 创建文件夹存放路径(这个要放在WEB-INF下,不能被直接访问 假如是path=wei-inf/a) 和 临时路径

​ 调用工厂方法(就是临时文件进去咋弄 传入刚才存放临时文件的文件夹)

​ 穿进去一个文件 设置临时空间(缓存区)的大小 设置存放的文件夹 就是穿进去的文件夹

​ 调用文件上传信息

​ 设置监听器 设置编码格式

​ 然后调用文件真正上传

​ 把前文件转换为req请求 uplod.parseRequest(request) 然后从这里面遍历 先判断是不是一个表单还是上传文件 要是是表 单 先continue 不是表单就继续判断文件名是否为空 里面有一个方法提取 getname().trim.equals(““)或 == null

​ 然后不是的话就开始提取文件名以及文件后缀 然后再来一个UUID 然后设置一个文件放的位置 为 a= path + “/”+uuid

​ 然后把a创建出来 然后下面再是 把文件上传转换为一个流 is 然后来一个os new os 的时候把路径放进去

​ 就 new fileOutStream(a+"/"+fileName) 然后一系列io操作 返回给调用的总方法

​ 然后看文件真正上传返回的信息 判断为什么 再设置req的attribute传给前端jsp页面 然后在前端页面获取msg

 

文件上传完之后去 设置attrifict里面 找到项目发布路径 然后再那个地址里面找你发布的到东西 就可以找到

![image-20211108194727314](C:\Users\shinelon\AppData\Roaming\Typora\typora-user-images\image-20211108194727314.png)

这是一个小重点

posted on 2021-11-08 19:56  1一1  阅读(78)  评论(0)    收藏  举报