jsp图片上传
一个JSP页面里写<input type="file">,片上表单提交后后台拿到的片上永远是文件名而不是文件本身——这事我见过太多人踩坑。原因很简单:浏览器默认用application/x-www-form-urlencoded编码,片上文件内容根本不会传。片上必须把form的片上enctype改成multipart/form-data,这是片上第一步,也是片上最容易被忽略的一步。 改完enctype之后,片上request.getParameter()就废了。片上因为multipart请求体不是片上键值对格式,Servlet容器不会自动解析。片上这时候有两个选择:用Apache Commons FileUpload手动解析,片上或者如果你的片上容器支持Servlet 3.0+,直接用@MultipartConfig注解加request.getPart()。片上 我平时更倾向后者,片上代码干净。在JSP对应的Servlet类上加一个注解就行: maxFileSize限制10MB,超过会抛IllegalStateException。这个异常得接住,不然用户看到的是500错误页,体验很差。 前端部分,一个最简表单长这样: 注意name属性,后台要用它来取Part。没写name的话,request.getPart(null)直接报错。 后台处理逻辑,我在UploadServlet的doPost里大概这么写: getSubmittedFileName()是Servlet 3.1才有的方法。如果你还在用3.0,得自己从Content-Disposition头里截取文件名,写起来挺烦的。 这里有个真实场景的坑。用户上传的文件名可能带路径,比如IE老版本会传"C:\Users\xxx\photo.jpg"过来。直接拿这个字符串拼路径,在Linux服务器上会创建一个叫"C:"的目录,然后报错。稳妥做法是先做一次文件名清洗: 两行都要写,因为不同浏览器传的分隔符不一样。 还有中文文件名的问题。Tomcat 8以后默认URI编码是UTF-8,一般不会乱码。但如果你的环境比较老,上传后文件名变成一堆问号,那就得在取文件名之前设置request.setCharacterEncoding("UTF-8")。这个设置对multipart请求体本身无效,但对某些容器解析头部信息有影响,具体得看你用的Tomcat版本。 存储路径也值得说一句。用getRealPath()把文件存到webapp目录下,重新部署war包的时候文件全丢。我以前在一个小项目里就这么干过,每次发版用户头像全没了,被骂得不轻。后来改成存到webapp外面的固定目录,数据库里只存相对路径,才算消停。 文件类型校验不能只看扩展名。有人把.jsp改成.jpg传上来,如果你的服务器配置不当,这个文件可能被当作JSP执行。至少要在保存前检查一下Content-Type,或者干脆用白名单限制扩展名。我一般会拒绝.jsp、.jspx、.exe这些,只允许图片和文档类格式。 整个流程跑通其实不到50行代码。JSP图片上传本身不复杂,麻烦的是边界情况:文件名编码、路径穿越、大小限制、存储位置。把这些都处理了,才算能用。@MultipartConfig(maxFileSize = 1024 * 1024 * 10) public class UploadServlet extends HttpServlet { ... }<form action="upload" method="post" enctype="multipart/form-data"> 选择文件:<input type="file" name="myfile" /> <input type="submit" value="上传" /> </form>Part filePart = request.getPart("myfile"); String fileName = filePart.getSubmittedFileName(); String savePath = getServletContext().getRealPath("/uploads"); File uploadDir = new File(savePath); if (!uploadDir.exists()) uploadDir.mkdirs(); filePart.write(savePath + File.separator + fileName);fileName = fileName.substring(fileName.lastIndexOf(File.separator) + 1); fileName = fileName.substring(fileName.lastIndexOf("/") + 1);
- 最近发表
- 随机阅读
- 搜索
-
- 友情链接
-