类加载异常处理和文件上传
文件上传页面启动报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里面 找到项目发布路径 然后再那个地址里面找你发布的到东西 就可以找到

这是一个小重点
浙公网安备 33010602011771号