使用jsp实现文件上传的功能
首先是表单的jsp文件:upload.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <%@ page contentType= "text/html;charset=UTF-8" language= "java" %> <html> <head> <title>文件上传</title> </head> <body> <h1>文件上传</h1> <form action= "message.jsp" method= "post" enctype= "multipart/form-data" > 选择一个文件: <input type= "file" name= "uploadFile" /> <br/><br/> <input type= "submit" value= "上传" /> </form> </body> </html> |
上传处理的jsp文件:message.jsp:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | <%-- Created by IntelliJ IDEA. User: DELL Date: 2018 / 4 / 20 Time: 14 : 10 To change this template use File | Settings | File Templates. --%> <%@ page contentType= "text/html;charset=UTF-8" language= "java" %> <%@ page import = "java.io.*,java.util.*,javax.servlet.*,javax.servlet.http.*" %> <%@ page import = "java.rmi.ServerException" %> <html> <head> <title></title> </head> <body> <% //定义上传文件的最大字节 int MAX_SIZE = 102400 * 102400 ; //创建根路径的保存变量 String rootPath; //声明文件读入类 DataInputStream in = null ; FileOutputStream fileOut = null ; //取得互联网程序的绝对地址 String realPath = request.getSession().getServletContext().getRealPath( "/" ); realPath = realPath.substring( 0 , realPath.indexOf( "\\out" )); // out.print(realPath); //创建文件的保存目录 rootPath = realPath + "\\web\\upload\\" ; //取得客户端上传的数据类型 String contentType = request.getContentType(); try { if (contentType.indexOf( "multipart/form-data" ) >= 0 ) { //读入上传数据 in = new DataInputStream(request.getInputStream()); int formDataLength = request.getContentLength(); if (formDataLength > MAX_SIZE) { out.print( "上传的字节不可以超过" + MAX_SIZE + "字节" ); return ; } //保存上传文件的数据 byte dataBytes[] = new byte [formDataLength]; int byteRead = 0 ; int totalBytesRead = 0 ; //上传的数据保存在byte数组里面 while (totalBytesRead < formDataLength) { byteRead = in.read(dataBytes, totalBytesRead, formDataLength); totalBytesRead += byteRead; } //根据byte数组创建字符串 String file = new String(dataBytes, "utf-8" ); //取得上传数据的文件名 String saveFile = file.substring(file.indexOf( "filename=\"" ) + 10 ); saveFile = saveFile.substring( 0 , saveFile.indexOf( "\n" )); saveFile = saveFile.substring(saveFile.lastIndexOf( "\\" ) + 1 , saveFile.indexOf( "\"" )); int lastIndex = contentType.lastIndexOf( "=" ); //取得数据的分隔字符串 String boundary = contentType.substring(lastIndex + 1 , contentType.length()); //创建保存路径的文件名 String fileName = rootPath + saveFile; int pos; pos = file.indexOf( "filename = \"" ); pos = file.indexOf( "\n" , pos) + 1 ; pos = file.indexOf( "\n" , pos) + 1 ; pos = file.indexOf( "\n" , pos) + 1 ; int boundaryLocation = file.indexOf(boundary, pos) - 4 ; //取得文件数据的开始的位置 int startPos = ((file.substring( 0 , pos)).getBytes()).length; int endPos = ((file.substring( 0 , boundaryLocation)).getBytes()).length; File checkFile = new File(fileName); if (checkFile.exists()) { out.println( "<p>" + saveFile + "文件已经存在.</p>" ); return ; } //检查上传文件的目录是否存在 File fileDir = new File(rootPath); if (!fileDir.exists()) { fileDir.mkdirs(); } //创建文件的输出类 fileOut = new FileOutputStream(fileName); //保存文件的数据 fileOut.write(dataBytes, startPos, (endPos - startPos)); fileOut.close(); out.print( "<b>文件上传成功</b>" ); } else { String content = request.getContentType(); out.print( "上传的文件类型是" + content + "类型的,请上传目录mutipart/form-data类型的文件" ); } } catch (Exception ex) { throw new ServerException(ex.getMessage()); } %> </body> </html> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!