使用Java实现文件的上传

2023-10-29

基于表单的文件上传

        标签<input type=”file”/>会在浏览器中显示一个输入框和一个按钮,输入框可供用户填写本地文件的文件名和路径名,按钮可以让浏览器打开一个文件选择框供用户选择文件。

        文件上传的表单例子如下:

<form action="upload" method="post" enctype="multipart/form-data">
    <input type="file" name="myfile"/>
    ...
</form>

        对于基于表单的文件上传,不要忘记使用enctype属性,并将它的值设置为multipart/form-data,同时将表单的提交方式设置为post。为什么要这样呢?下面从enctype的属性说起。

表单的enctype属性指定的是表单数据的编码方式,该属性有以下3个值。

  1. application/x-www-from-urlencoded:这是默认的编码方式,它只处理表单域李的value属性值。
  2. multipart/form-data:该编码方式以二进制流的方式来处理表单数据,并将文件域指定文件的内容封装到请求参数里。
  3. Text/plain:该编码方式只有当表单的action属性以mailto:URL的形式是才使用,主要适用于直接通过表单发送邮件的方式。

        由上面的三个属性的解释可知,在基于表单上传文件时enctype的属性值应为multipart/form-data。

单文件上传关键步骤如下:

创建文件选择页面

        在WebContent目录下创建JSP页面oneFile.jsp,在该页面中使用表单上传单个文件,具体代码如下:

<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="${pageContext.request.contextPath}/onefileupload" method="post" enctype="multipart/form-data">
        选择文件:<input type="file" name="mmyfile"><br>
        文件描述:<input type="text" name="description"><br>
        <input type="submit" value="提交">
    </form>
</body>
</html>

创建POJO类

        在src目录下创建pojo包,在该包中创建POJO类FileDomain。然后在该POJO类中声明一个MultipartFile类型属性封装被上传的文件信息,属性名与文件选择页面oneFile.jsp中的file类型的表单参数名myfile相同。具体代码如下:

package pojo;

import org.springframework.web.multipart.MultipartFile;

public class FileDomain {
    private String description;
    private MultipartFile mmyfile;

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public MultipartFile getMmyfile() {
        return mmyfile;
    }

    public void setMmyfile(MultipartFile mmyfile) {
        this.mmyfile = mmyfile;
    }
}

创建控制器类

        在src目录下创建controller包,并在该包中创建FileUploadController控制器类。具体代码如下:

package controller;

import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import pojo.FileDomain;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
@Controller
public class FileUploadController {
    private static final Log logger= LogFactory.getLog(FileUploadController.class);
    @RequestMapping("/onefilejsp")
    public String file(){
        return "oneFile";
    }
    @RequestMapping("/onefileupload")
    public String oneFileUpload(@ModelAttribute FileDomain fileDomain, HttpServletRequest request){
        String realpath=request.getServletContext().getRealPath("uploadfiles");
        System.out.println(realpath);
        String fileName=fileDomain.getMmyfile().getOriginalFilename();
        File targetFile=new File(realpath,fileName);
        if(!targetFile.exists()){
            targetFile.mkdirs();
        }
        try {
            fileDomain.getMmyfile().transferTo(targetFile);
            logger.info("成功");
        }
        catch(Exception e){
            e.printStackTrace();
        }
        return "showOne";
    }
}

创建配置文件

    在上传文件时需要在配置文件中使用Spring的CommonsMultipartResolver类配置MultipartResolver用于文件上传,应用的配置文件springmvc-servlet.xml的代码如下:

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context
                           http://www.springframework.org/schema/context/spring-context.xsd
                           http://www.springframework.org/schema/mvc
                           http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <context:component-scan base-package="controller"></context:component-scan>
    <mvc:annotation-driven/>
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="UTF-8"/>
        <property name="maxUploadSize" value="5400000"/>
    </bean>
</beans>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Java实现文件的上传 的相关文章

  • volatile、final 和synchronized 安全发布的区别

    给定一个带有变量 x 的 A 类 变量 x 在类构造函数中设置 A x 77 我们想将 x 发布到其他线程 考虑以下 3 种变量 x 线程安全 发布的情况 1 x is final 2 x is volatile 3 x 设定为同步块 sy
  • 音频 blob 的 URL.createObjectURL 在 Firefox 中给出 TypeError

    我正在尝试从创建的音频 blob 创建对象 URLgetUserMedia 该代码在 Chrome 中可以运行 但在 Firefox 中存在问题 错误 当我打电话时stopAudioRecorder 它停在audio player src
  • 表单计算器脚本基本价格未加载 OnLoad

    我的表单中有一个计算器来计算我的下拉选项选择 function select calculate on change calc input type checkbox calculate on click calc function cal
  • 通过 CDN 使用 Dojo 时如何加载自定义 AMD 模块?

    我正在使用 google 的 CDN 并尝试使用他们的加载程序加载我自己的 AMD 模块 我知道我做错了什么 但我被困住了 有任何想法吗
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • 如何使输入字段和提交按钮变灰

    我想变灰这两件事 http doorsplit heroku com 歌曲输入字段和提交按钮 直到用户输入艺术家 有没有一种简单的方法可以通过 JQuery 来做到这一点 艺术家输入字段的id是 request artist 你可以这样做
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • 提交表单并重定向页面

    我在 SO 上看到了很多与此相关的其他问题 但没有一个对我有用 我正在尝试提交POST表单 然后将用户重定向到另一个页面 但我无法同时实现这两种情况 我可以获取重定向或帖子 但不能同时获取两者 这是我现在所拥有的
  • Angular 2+ 安全性;保护服务器上的延迟加载模块

    我有一个 Angular 2 应用程序 用户可以在其中输入个人数据 该数据在应用程序的另一部分进行分析 该部分仅适用于具有特定权限的人员 问题是我们不想让未经授权的人知道how我们正在分析这些数据 因此 如果他们能够在应用程序中查看模板 那
  • 为 illustrator 导出脚本以保存为 web jpg

    任何人都可以帮我为 illustrator CC2017 编写一个脚本 将文件以 JPG 格式导出到网络 旧版 然后保存文件并关闭 我有 700 个文件 每个文件有 2 个画板 单击 文件 gt 导出 gt 另存为 Web 旧版 然后右键文
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • FireFox 中的自动滚动

    我的应用程序是实时聊天 我有一个 Div 来包装消息 每条消息都是一个 div 所以 在几条消息之后 我的 DOM 看起来像这样 div div Message number two div div div div
  • Javascript 纪元时间(以天为单位)

    我需要以天为单位的纪元时间 迄今为止 我已经看到过有关如何翻译它的帖子 但几天后就没有了 我对纪元时间很不好 我怎么能得到这个 我需要以天为单位的纪元时间 我将解释为您想要自纪元以来的天数 纪元本身是第 0 天 或第 1 天的开始 无论您如
  • 在java中为组合框分配键

    我想添加一个JComboBox在 Swing 中这很简单 但我想为组合中的每个项目分配值 我有以下代码 JComboBox jc1 new JComboBox jc1 addItem a jc1 addItem b jc1 addItem
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供
  • 导致回发到与弹出窗口不同的页面

    我有一个主页和一个详细信息页面 详细信息页面是从主页调用的 JavaScript 弹出窗口 当单击详细信息页面上的 保存 按钮时 我希望主页 刷新 是否有一种方法可以调用主页的回发 同时还可以从详细信息页面维护保存回发 Edit 使用win
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐

  • 【Vue】vue.js中组件的使用

    文章目录 组件 创建全局组件 创建局部组件 组件中的data和methods 组件 组件 Component 是 Vue js 最强大的功能之一 组件可以扩展 HTML 元素 封装可重用的代码 在较高层面上 组件是自定义元素 Vue js
  • SpringSecurity基于WebFlux实现验证授权启动报conversionServicePostProcessor already been defined

    基于WebFlux实现SpringSecurity验证授权报以下错误 The bean conversionServicePostProcessor defined in class path resource org springfram
  • jdbc连接sqlserver2008过程注意几点(非web项目)

    教材上的是sqlserver2000版本的连接 网上写的又都太散 看了一直蒙圈 只能报一次错解决一次 断断续续弄了两天 1 下载驱动只需要将sqljdbc4 jar添加到项目中 网上有说最好把sqljdbc jar和sqljdbc4 jar
  • C# 依赖倒置原则(DIP)

    目录 一 引子 1 1 传统的程序架构 1 2 依赖倒置 1 3 依赖倒置的作用 二 依赖注入 一 引子 1 1 传统的程序架构 在程序执行过程中 传统的程序架构如图 可以看到 在传统的三层架构中 层与层之间是相互依赖的 UI层依赖于BLL
  • jsp利用cookie实现记住账号,密码

    这个功能很简单 不过 因为太简单 所以不是很安全 后续可以引MD5对账号密码进行加密 好了废话不多说 上代码 1引入cookie js 2 复选框 默认选中的 你也可以改为false
  • gta5nat严格怎么办_如何解决在游玩 GTA 在线模式时出现的 NAT 类型为“严格”(Strict)的错误...

    问 有错误信息提示我的 NAT 类型为 严格 Strict 这是什么意思 我该如何修改我的 NAT 类型 答 NAT 的全称是网络地址转换 特指您路由器或网关设备将您电脑的私有 IP 进行转换 并将其传输至公网 IP 和端口的功能 您的 N
  • 2022Robocom省赛(本科组)RC-u1 不要浪费金币

    哲哲最近在玩一个游戏 击杀怪物能获得金币 这里记击杀第 i 个怪物获得的金币数量为 Pi 然而这个游戏允许拥有的金币数量是有上限的 当超过时 超过上限的部分就会被系统光明正大地吃掉 哲哲就拿不到了 为了不浪费金币 哲哲决定 当下一个要击杀的
  • Java 1017 A除以B

    题目内容 本题要求计算 A B 其中 A 是不超过 1000 位的正整数 B 是 1 位正整数 你需要输出商数 Q 和余数 R 使得 A B Q R 成立 输入格式 输入在一行中依次给出 A 和 B 中间以 1 空格分隔 输出格式 在一行中
  • BI大数据的星形模型和雪花模型

    23333架构模式的选择 数据仓库的架构主要有星型和雪花型两种方式 下面从多个角度来比较一下这两种模式的利弊 从查询性能角度来看 在OLTP DW环节 由于雪花型要做多个表联接 性能会低于星型架构 但从DW OLAP环节 由于雪花型架构更有
  • vue中的动态导入样式表

    如果vue需要根据平台动态导入样式可以这样操作 在main js中定义一个判断平台的变量 const ismobile Android webOS iPhone iPad iPod BlackBerry Windows Phone i te
  • MYSQL中的连接查询

    通过对DQL的学习 我们可以很轻松的从 张数据表中查询出需要的数据 在企业的应 开发中 我们经常需要从多张表中查询数据 例如 我们查询学 信息的时候需要同 时查询学 的班级信息 可以通过连接查询从多张数据表提取数据 在MySQL中可以使 j
  • CentOS 7 openssl 3.0.10 rpm包制作 —— 筑梦之路

    源码下载地址 https www openssl org source openssl 3 0 10 tar gz 编写spec文件 cat lt lt EOF gt openssl spec Summary OpenSSL 3 0 10
  • Android 代码优化工具FindBugs

    原文地址 https juejin im post 58d4e35261ff4b00605326d9 1 前言 在我们平时项目开发中 经常会写一些不严谨的代码或者一些比较低级的错误代码 但是这些错误往往很难被发现 这样就导致了我们的项目中会
  • 洛谷 P1226 【模板】快速幂

    题目链接 https www luogu com cn problem P1226 include
  • 上半年实现营收9.24亿元,创新奇智的AI成制造业福星?

    如今 AI大模型迈入了商业化落地的新阶段 并且已经有不少产品被不知不觉地应用到了生活各个方面 其中 作为AI领域的后起之秀 创新奇智也于近日发布了截至2023年6月30日止六个月的中期业绩报告 数据显示 创新奇智2023年上半年公司实现营收
  • 线代【向量组与线性空间】--猴博士爱讲课

    第五课 向量组与线性空间 1 4判断某向量是否可由某向量组线性表示 这些只有一行 列 的矩阵既可以称作为向量 判断的标准 若 a1 a2 am 的秩与 a1 a2 am b 的秩相等 则b可由a a2 am线性表示 2 4判断某个向量组是否
  • final关键字最全了解

    final关键字的使用 在Java中声明类 属性和方法时 可使用关键字final来修饰 1 final标记的类不能被继承 2 final标记的方法不能被子类复写 3 final标记的变量 成员变量或局部变量 即为常量 只能赋值一次 fina
  • 消息队列之Kafka 日志清理(六)

    Kafka是一个基于日志的流处理平台 一个topic可以有多个分区 partition 分区是复制的基本单元 在单节点上 一个分区的数据文件可以存储在多个磁盘目录中 配置项是 A comma separated list of direct
  • ps 命令

    NAME ps report a snapshot of the current processes SYNOPSIS ps aAcdefHjlmNVwy acefghLnrsSTuvxX C lt 指令名称 gt g lt 群组名称 gt
  • 使用Java实现文件的上传

    基于表单的文件上传 标签