问题:一开始项目一直启动不了,是因为用maven创建项目还导入jar包,导致lib目录冲突。
删除导入的jar包,都使用maven依赖就行了。

java.lang.IndexOutOfBoundsException
                     * 	java.io.FileOutputStream.writeBytes(Native Method)
                     * 	java.io.FileOutputStream.write(FileOutputStream.java:326)
                     * 	com.dongmu.servlet.FileServlet.service(FileServlet.java:72)
                     * 	javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
这个是因为缓冲区读取的时候判断条件错误导致的。
package com.dongmu.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.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;

public class FileServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建工厂类
        DiskFileItemFactory fileItemFactory = new DiskFileItemFactory();
        //创建解析器
        ServletFileUpload fileUpload = new ServletFileUpload(fileItemFactory);
        fileUpload.setHeaderEncoding("utf-8");
        //使用解析器解析request对象
        List<FileItem> list=null;
        try {
            list=fileUpload.parseRequest(req);
            for (FileItem fileItem : list) {
                if (!fileItem.isFormField()) {
                    //上传文件的全部路径,String getName():获取文件字段的文件名。如果是普通字段,则返回null
                    String name = fileItem.getName();
//注意:String getFieldName():获取表单项的name的属性值。
                    System.out.println("上传文件的全部路径:"+name);
                    //获取上传文件的文件名
                    String filename = name.substring(name.lastIndexOf("/")+1);
                    System.out.println("文件名"+filename);

                    //上传文件的类型
                    String type = name.substring(name.indexOf(".")+1);
                    System.out.println("上传文件的类型"+type);

                    //使用UUID保证文件名唯一
                    String uuidPath= UUID.randomUUID().toString();

                    String uploadPath = this.getServletContext().getRealPath("/WEB-INF/upload");
                    File uploadFile = new File(uploadPath);
                    if (!uploadFile.exists()){
                        uploadFile.mkdir();
                    }

                    String realPath = uploadPath+"/"+uuidPath;
                    File realuploadFile = new File(realPath);
                    if (!realuploadFile.exists()){
                        realuploadFile.mkdirs();
                    }

                    long size = fileItem.getSize();
                    System.out.println("文件的大小:"+size);

                    //获得文件的上传流
                    InputStream inputStream = fileItem.getInputStream();
                    //获取文件的输出流
                    FileOutputStream outputStream = new FileOutputStream(realPath+"/"+filename);

                    //创建一个缓冲区
                    byte[] bytes = new byte[1024*1024];

                    int len = 0;

                    /**
                     * 这里写>0,不能写!=0;因为读完的时候会返回-1,导致一个异常。
                     * 网上查到了这个异常但是都没有说解决办法。
                     * java.lang.IndexOutOfBoundsException
                     * 	java.io.FileOutputStream.writeBytes(Native Method)
                     * 	java.io.FileOutputStream.write(FileOutputStream.java:326)
                     * 	com.dongmu.servlet.FileServlet.service(FileServlet.java:72)
                     * 	javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
                     * 	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
                     * 	org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:109)
                     */
                    while ((len=inputStream.read(bytes))>0){
                        outputStream.write(bytes,0,len);
                    }

                    outputStream.close();
                    inputStream.close();

                    System.out.println("文件上传成功");
                    //上传成功清除临时文件
                    fileItem.delete();

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

    }
}

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐