热门话题404

你是否经常使用idea碰到这样的问题,复制多个博主的代码,却依然如此?后面才发现是不熟练使用idea这软件才导致的
建立fileupload项目的正确顺序
新建项目
添加框架支持web
点击web-inf右键新建classes目录,在idea中如果不修改class文件的输出路径的话,会默认在工程下创建一个out文件用来装编译的class文件或者说是用来存放在src目录下文件(包括配置文件,只要在src目录下就会被加载到out里面),这样就导致servlet访问不到,也就404了
修改classes的输出位置


把输出目录和测试输出目录改为你刚刚建立的classes目录
点击web-inf右键新建lib把下面三个包复制进来
commons-fileupload 1.4
commons-io 2.11.0
servlet -api
6.配置tomcat

注意事项
一定要更改classes输出目录,idea的通病
一定不能把index.jsp放在web-inf下,默认就好了
代码展示
关于文件上传的原理
因为浏览器本身的限制,浏览器是不能直接操作文件系统的,需要通过浏览器所暴露出来的统一接口,由用户主动授权发起来访问文件动作,然后读取文件内容进指定内存里,最后执行提交请求操作,将内存里的文件内容数据上传到服务端,最后服务端解析前端传来的数据信息后存入文件里
文件就是磁盘上的一段空间,文件的内容就是一串2进制数字(1或者0)。
文件传输,就是把这串数字通过http协议传过去。
服务器端,接到这段数据之后,按照协议规定的格式,把这串数字取出来,然后创建一个空文件(分配一段空间),然后把这段数字写进去,就成了一个跟上传文件完全一致的新文件
代码展示(因为直接用注解来映射,所以不需要配置web.xml)

index.jsp
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2023/2/22
Time: 16:09
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件上传</title>
</head>
<body>
<form action="UploadServlet" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="username" /> <br>
头像 :<input type="file" name="photo"> <br>
<input type="submit" value="上传">
</form>
</body>
</html>
Servlet.java
package Servlet;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
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.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.List;
@WebServlet("/UploadServlet")
public class UploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
if(ServletFileUpload.isMultipartContent(req)){
//创建FileItemFactory工厂实现类
FileItemFactory fileItemFactory=new DiskFileItemFactory();
//创建用于解析上传数据的工具类
ServletFileUpload servletFileUpload=new ServletFileUpload(fileItemFactory);
//解析上传的数据,得到每一个表单FileItem
try {
List<FileItem> list=servletFileUpload.parseRequest(req);
//循环判断每一个表单项,是普通类型,还是上传的文件
for(FileItem fileItem:list){
if(fileItem.isFormField()){
//普通表单项
System.out.println("表单项的name属性值:"+fileItem.getFieldName());
//参数utf-8解决乱码问题
System.out.println("表单项的value属性值:"+fileItem.getString("utf-8"));
}else {
//上传的文件
System.out.println("表单项的name属性值:"+fileItem.getFieldName());
System.out.println("上传的文件名:"+fileItem.getName());
//上传路径
fileItem.write(new File("d:\\"+fileItem.getName()));
}
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}
想要更深层次的了解Servlet,请访问Servlet详解
