Servlet上传文件详细解析以及注意事项

Servlet 文件上传详解 Servlet 文件上传是网站和应用程序中常用的功能。通过本文的介绍,相信读者已经对 Servlet 文件上传有了较为全面的了解。在实际开发过程中,要结合具体需求,灵活运用文件上传技术。 阅读详情


准备阶段,下载需要的包:

在Servlet中进行文件上传需要用到外部的类库,apache提供了这些类库, 主要需要commons-fileupload.jar和commons-io.jar

下载的步骤如下:
进入www.apache.org网站, ——>在Projects下找到commons,点击进入——>找到Components下的FileUpload,点击进入就可以找到下载

页面如下:

可以看到这里有开发指南和下载地址,如果要详细学习,慢慢看这里的资源就可以了。

 

commons-io.jar包的下载地址:http://commons.apache.org/fileupload/dependencies.html

把两个jar包放到WEB-INF的lib目录下。

 

开发阶段:

上传页面:index.jsp

复制代码
 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <%
 3 String path = request.getContextPath();
 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
 5 %>
 6 
 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 8 <html>
 9   <head>
10     <base href="<%=basePath%>">
11     
12     <title>文件上传</title>
13     <meta http-equiv="pragma" content="no-cache">
14     <meta http-equiv="cache-control" content="no-cache">
15     <meta http-equiv="expires" content="0">    
16     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
17     <meta http-equiv="description" content="This is my page">
18     <!--
19     <link rel="stylesheet" type="text/css" href="styles.css">
20     -->
21   </head>
22   
23   <body>
24        <form action="upload" method="post" enctype="multipart/form-data">
25            文件别名:<input type="text" name="filename"><br>
26            选择文件:<input type="file" name="fileupload"><br>
27            <input type="submit" value="提交">
28        
29        </form>
30   </body>
31 </html>
复制代码

 

 这里注意第24行,上传文件时要指定提交方法method="post", 信息类型为enctype="multipart/form-data"

 

上传功能servlet:FileUpload

复制代码
 1 package com.sunflower.servlet;
 2 
 3 import java.io.File;
 4 import java.io.IOException;
 5 import java.util.Iterator;
 6 import java.util.List;
 7 
 8 import javax.servlet.ServletException;
 9 import javax.servlet.http.HttpServlet;
10 import javax.servlet.http.HttpServletRequest;
11 import javax.servlet.http.HttpServletResponse;
12 
13 import org.apache.commons.fileupload.FileItem;
14 import org.apache.commons.fileupload.FileItemFactory;
15 import org.apache.commons.fileupload.FileUploadException;
16 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
17 import org.apache.commons.fileupload.servlet.ServletFileUpload;
18 
19 public class FileUpload extends HttpServlet {
20     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
21         req.setCharacterEncoding("UTF-8");
22         fileControl(req, resp);
23     }
24 
25     /**
26      * 上传文件的处理
27      */
28     private void fileControl(HttpServletRequest req, HttpServletResponse resp) throws ServletException {
29 
30         // 在解析请求之前先判断请求类型是否为文件上传类型
31         boolean isMultipart = ServletFileUpload.isMultipartContent(req);
32 
33         // 文件上传处理工厂
34         FileItemFactory factory = new DiskFileItemFactory();
35 
36         // 创建文件上传处理器
37         ServletFileUpload upload = new ServletFileUpload(factory);
38 
39         // 开始解析请求信息
40         List items = null;
41         try {
42             items = upload.parseRequest(req);
43         }
44         catch (FileUploadException e) {
45             e.printStackTrace();
46         }
47 
48         // 对所有请求信息进行判断
49         Iterator iter = items.iterator();
50         while (iter.hasNext()) {
51             FileItem item = (FileItem) iter.next();
52             // 信息为普通的格式
53             if (item.isFormField()) {
54                 String fieldName = item.getFieldName();
55                 String value = item.getString();
56                 req.setAttribute(fieldName, value);
57             }
58             // 信息为文件格式
59             else {
60                 String fileName = item.getName();
61                 int index = fileName.lastIndexOf("\\");
62                 fileName = fileName.substring(index + 1);
63                 req.setAttribute("realFileName", fileName);
64 
65                 // 将文件写入
66 //                String path = req.getContextPath();
67 //                String directory = "uploadFile";
68 //                String basePath = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + path + "/" + directory;
69                 String basePath = req.getRealPath("/uploadFile");
70                 File file = new File(basePath, fileName);
71                 try {
72                     item.write(file);
73                 }
74                 catch (Exception e) {
75                     e.printStackTrace();
76                 }
77             }
78         }
79 
80         try {
81             req.getRequestDispatcher("/uploadsuccess.jsp").forward(req, resp);
82         }
83         catch (IOException e) {
84             e.printStackTrace();
85         }
86     }
87 }
复制代码

 

 这里要注意第66~68行,将文件上传到Web项目的"uploadFile"文件夹中,如果用这种方法得到的路径是"http://localhost:8080/upload/uploadFile", 而创建File类用的路径是绝对路径,这样就会出问题,所以这里要用的是得到真实路径的方法HttpServletRequest.getRealPath().

 

以上是最简单的文件上传,如果要加入上传的限制可以在DiskFileItemFactory和ServletFileUpload中进行限制:

在34行后加入:

        //创建临时文件目录
        File tempFile = new File(req.getRealPath("/temp"));
        //设置缓存大小
        ((DiskFileItemFactory) factory).setSizeThreshold(1024*1024);
        //设置临时文件存放地点
        ((DiskFileItemFactory) factory).setRepository(tempFile);

 

注意第72行的FileItem.write()方法,如果使用了这个方法写入文件,那么临时文件会被系统自动删除.

在38行后加入:

        //将页面请求传递信息最大值设置为50M
        upload.setSizeMax(1024*1024*50);
        //将单个上传文件信息最大值设置为6M
        upload.setFileSizeMax(1024*1024*6);

 

原文:http://www.cnblogs.com/hanyuan/archive/2012/06/09/upload.html
Java中实现文件上传的完整指南 Servlet是Java EE规范的一部分,它提供了一种基于Java的Web服务器端编程技术。Servlet在服务器端运行,并通过响应HTTP请求来处理客户端(如Web浏览器)的请求。它是Java语言编写的服务器端程序,其主要功能在于交互式地浏览和修改数据,生成动态Web内容。Servlet被设计为在服务器上运行,能够响应用户的请求,并生成响应。它主要负责接收来自客户端(通常是Web浏览器)的请求,处理请求并返回响应。 阅读详情

相关推荐

图信号处理中的多尺度分析:图小波变换与图傅里叶变换的对比与应用

本文深入探讨了图信号处理中的多尺度分析方法,重点对比了图小波变换(GWT)与图傅里叶变换(GFT)的技术特点与应用场景。通过分析图的拓扑结构,GWT展现出强大的局部洞察力,适用于异常检测和社区发现;而GFT则擅长全局频率分析,适合趋势分析和信号去噪。文章结合实战案例,为读者提供了方法选型指南和前沿进展,帮助开发者在生物信息学、社交网络分析等领域高效应用这些技术。

weixin_30369041的博客 406

上传文件 —— Servlet

上传文件也是一个常见的需求,在Servlet中也提供了支持。上传文件的时候,在前端需要用到form 表单,在 form 表单中需要使用到特殊的类型:form-data。此时提交文件的时候,浏览器就会把文件内容以 form-data 的格式构造到 HTTP 请求中,服务器就可以通过 getPart 来获取了。一个 HTTP 请求,可以一次性提交多个文件。每个文件都称为一个,每个 Part 都有一个(身份标识),服务器代码中就可以根据 name 找到对应的 Part。

AwwzJ_0821的博客 2064

【人工智能AI】是什么?

人工智能(Artificial Intelligence),英文缩写为AI。它是研究、开发用于模拟延伸和扩展人的智能的理论方法技术及应用系统的一门新的技术科学。(百度百科)人工智能的基本原理:机器从「特定的」大量数据中总结规律,形成某些「特定的知识」,然后将这种「知识」应用到现实场景中去解决实际问题。在这个基本原理的基础上,有3个特征:1、人工智能本质上是一种工具2、人工智能技能只能解决特定的问题,而不是什么都能做3、人工智能属于归纳逻辑,可以告诉你是什么,但是不能告诉你为什么。

KJCZ.AK的博客 2万+

servlet实现文件上传

使用FileUpload实现上传,是第三方库由appache的commons提供的上传组件,主要是帮我们解析req.getInputStream()中前端传过来的参数和上传的文件。java中解析文件上传数据的库,常见的FileUpload库(Spring中默认的上传库)、SmartUpload。(1)application/x-www-form-urlencoded默认取值:普通表单提交类型。上传文件类型,传输的数据以boundary进行分割,以---${boundary}开始。

weixin_42223524的博客 858

从零搭建PIC MCU开发环境:MPLAB IDE与HI-TECH编译器安装破解全攻略

本文详细介绍了从零搭建PIC MCU开发环境的完整流程,包括MPLAB IDE 8.85的安装配置、HI-TECH C编译器的安装与破解,以及PICkit3编程器的使用技巧。通过清晰的步骤说明和常见问题解决方案,帮助开发者快速搭建稳定的PIC单片机开发环境,适用于PIC16/18系列MCU开发。

weixin_29188997的博客 291

F5 Shape盾JSVMP核心检测点与无限并发Header生成实战(TikTok/航司)

本文深入剖析了F5 Shape盾结合JSVMP技术的核心风控机制,详细解读了其针对浏览器指纹、行为时序等多维度的检测逻辑。通过实战案例,分享了如何通过逆向分析、精准Hook关键检测点,并构建稳定、高并发的请求Header生成方案,以应对TikTok、航司等平台的高级反爬挑战。

weixin_29325007的博客 1010

Servlet 实现上传文件

文件上传

xaiobit_hl的博客 2327

避开这些坑!海天MA1600注塑机数据采集项目经验分享

本文分享了海天MA1600注塑机数据采集项目的实战经验。针对KEBA控制器接口不开放的难题,项目采用专用网关进行协议转换,并详细剖析了网络部署、ModbusTCP配置、数据准确性保障及现场运维中遇到的典型陷阱与解决方案,为同类工业物联网项目提供宝贵参考。

o4p5q6r7s的博客 490

Servlet 文件上传

通过上述步骤,您可以在Servlet中实现文件上传功能。确保在处理文件上传时注意安全性,并根据需要调整文件大小和类型的限制。

lsx202406的博客 1075

二维码扫描与页面跳转的完整流程解析

本文详细解析了二维码扫描与页面跳转的完整流程,从核心原理到前后端实现,涵盖了二维码生成、扫码事件处理、后端验证机制及跳转逻辑等关键环节。特别介绍了如何使用qrcode.js生成二维码、WebSocket处理扫码状态以及JWT令牌验证设计,帮助开发者构建安全高效的扫码跳转系统。

cicd6pipeline的博客 1088

后台管理系统-7-vue3之引入配置文件baseURL

mock=false,本地模拟。mock=true,线上模拟。baseURL+url=实际请求的URL。get请求param参数,post请求data参数。

qq_20466211的博客 207

Servlet——文件的上传

Servlet——文件的上传

chenxingxingxing的博客 3885

使用Android Studio调试系统应用之TvSettings(一):移植

对于做ROM的同仁、以及想要深入学习Android同学,必定会去调试Android的系统APK,而 *aosp* 源码中的系统APK源码,无法直接在Android Studio中进行调试,本文将持续更新细节,手把手教你,使用Android Studio调试安卓的系统应用。在每个阶段,提供知识点的梳理、总结,为您答疑解惑!

上周的博客 2054

Java文件上传注意事项_Servlet上传文件详细解析以及注意事项

准备阶段,下载需要的包: 在Servlet中进行文件上传需要用到外部的类库,apache提供了这些类库, 主要需要commons-fileupload.jar和commons-io.jar 下载的步骤如下: 进入www.apache.org网站, ——>在Projects下找到commons,点击进入——>找到Components下的FileUpload,点击进入就可以找到下载 页面如...

weixin_31089065的博客 178

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

servlet 上传文件 参数中文乱码

获取数据时需要进行转码 item.getString("网站使用编码utf-8,GBK等"); public class FileUpLoad extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) ...

weixin_33973600的博客 268

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

第二阶段(day17)文件上传

...

sunshine195的博客 466

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

jsp+servlet实现文件上传

上传(上传不能使用BaseServlet)   1. 上传对表单限制   * method="post"   * enctype="multipart/form-data"   * 表单中需要添加文件表单项:&lt;input type="file" name="xxx" /&gt;   &lt;form action="xxx" method="post&qu

weixin_34088583的博客 146

文件上传

1、注意要点: 表单提交一定是post 在表单中药设置enctype=”multipart/form-data”以二进制流的方式传数据给服务器。 2、IE上传的信息 ------WebKitFormBoundaryLbE9vGVhsqQDsaaN Content-Disposition: form-data; name="name" wrfw ------WebKitFormBound...

玉爷的博客 142
上一篇: repo
下一篇: ios设备获取存储空间
focusjava
博客等级 码龄14年 127粉丝 528原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值