文件上传fileupload(彻底解决HTTP状态 404 - 未找到)

热门话题404

你是否经常使用idea碰到这样的问题,复制多个博主的代码,却依然如此?后面才发现是不熟练使用idea这软件才导致的

建立fileupload项目的正确顺序

  1. 新建项目

  1. 添加框架支持web

  1. 点击web-inf右键新建classes目录,在idea中如果不修改class文件的输出路径的话,会默认在工程下创建一个out文件用来装编译的class文件或者说是用来存放在src目录下文件(包括配置文件,只要在src目录下就会被加载到out里面),这样就导致servlet访问不到,也就404了

  1. 修改classes的输出位置

把输出目录和测试输出目录改为你刚刚建立的classes目录

  1. 点击web-inf右键新建lib把下面三个包复制进来

  • commons-fileupload 1.4

  • commons-io 2.11.0

  • servlet -api

6.配置tomcat

注意事项

  1. 一定要更改classes输出目录,idea的通病

  1. 一定不能把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详解

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值