解决ajax发送Formdata数据包含文件和text数据,spring后台无法通过MultipartFile拿到文件

Minio Java SDK 8.x 实战:3种文件上传方案对比与5GB大文件处理 本文深入解析Minio Java SDK 8.x中的三种文件上传方案:putObject、uploadObject和getPresignedPostFormData,通过代码示例和性能对比帮助开发者选择最佳方案。特别针对5GB以上大文件处理,详细介绍了分片上传的实现方法和优化技巧,提升对象存储操作效率。 阅读详情

一开始直接使用ajax发送Formdata数据,spring后台multipartfile无法接受到文件。

经查阅很多资料,发现给我的页面加一个<form>表单,其他都不需要修改,后台即可拿到文件。

<!DOCTYPE html>
<html>

	<head>
		<meta charset="UTF-8">
		<title>加密与解密</title>
		<link rel="stylesheet" href="css/bootstrap.min.css" />
		<link rel="stylesheet" href="css/encrypt.css" />
		<script type="text/javascript" src="js/encrypt.js" ></script>
		<script type="text/javascript" src="js/jquery.min.js" ></script>
	</head>

	<body>
	    <form class="inpform" id="uploadForm" enctype="multipart/form-data">
		<div class="col-lg-6">
			<div class="input-group input-center">
				<input id="t1" type="text" class="form-control" placeholder="请选择需要加密的文件">
				<span class="input-group-btn">
					<input type="file" id="file" name="mpfile" onchange="getFilePath()" style="filter:alpha(opacity=0);opacity:0;width: 0;height: 0;"/>   
        			<button id="bj1" class="btn btn-default" type="button" onclick="selectFile();">请选择</button>
      			</span>
			</div>
			<div class="input-group input-center">
				<input id="t2" name="key" type="password" class="form-control" placeholder="请选输入密钥(或随机生成)">
				<span class="input-group-btn">
        			<button id="bj2" class="btn btn-default" type="button" onclick="KeyRandom()">随机生成</button>
      			</span>
			</div>
			<div class="radio"> 
                <label class="radio-inline">
                    <input type="radio" name="optionsRadiosinline" id="optionsRadios1" value="1" checked> 加密
                </label>
                <label class="radio-inline">
                        <input type="radio" name="optionsRadiosinline" id="optionsRadios2"  value="2"> 解密
                </label>
            </div>
            <div class="radio"> 
                <label class="radio-inline">
                    <input type="radio" name="optionsRadiosinline2" id="optionsRadios3" value="3" checked> ECB模式
                </label>
                <label class="radio-inline">
                        <input type="radio" name="optionsRadiosinline2" id="optionsRadios4"  value="4"> CBC模式
                </label>
            </div>
            <div class="radio"> 
                <label class="radio-inline">
                    <input type="radio" name="optionsRadiosinline3" id="optionsRadios5" value="5" checked> 操作后上传
                </label>
                <label class="radio-inline">
                    <input type="radio" name="optionsRadiosinline3" id="optionsRadios6"  value="6"> 操作后下载
                </label>
            </div>
			<div class="button">
                <button id="btn1" type="button" class="btn btn-primary" onclick="Save()">上传</button>
            </div>
            <div class="button">
                <span>请先上传文件再下载!</span>
            </div>
            <div class="button">
                <button id="btn2" type="button" class="btn btn-primary" onclick="DownLoad()">下载</button>
            </div>
		</div>
		  </form>
	</body>

</html>

spring后台:

package com.cczu.sm.controller;


import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;


import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


import org.apache.commons.io.FileUtils;
import org.bouncycastle.util.encoders.Hex;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;


import com.cczu.sm.entity.SM3Digest;
import com.cczu.sm.entity.SM4;
import com.cczu.sm.entity.SM4Utils;
import com.cczu.sm.entity.SM4_Context;
import com.cczu.sm.entity.Util;


@Controller
public class SmController {
    @RequestMapping("/sm")
    @ResponseBody
    public void getFile(String optionsRadiosinline3,
            String optionsRadiosinline2, String optionsRadiosinline,
            String key, MultipartFile mpfile) throws Exception {
        String filename = mpfile.getOriginalFilename();
        String mykey = key;
        String myoption = optionsRadiosinline;
        System.out.println("密钥:" + mykey + "\n" + "文件名:" + filename + "\n"
                + "功能选择:" + myoption);


        byte[] input = mpfile.getBytes();


        //SM3杂凑密钥
        byte[] md = new byte[32];
        byte[] msg1 = mykey.getBytes();
        SM3Digest sm3 = new SM3Digest();
        sm3.update(msg1, 0, msg1.length);
        sm3.doFinal(md, 0);
        String s = new String(Hex.encode(md)).substring(0, 16).toUpperCase();
        //        System.out.println("杂凑密钥:" + s);


        //SM4加密
        //optionsRadiosinline等于1加密,等于2解密
        //optionsRadiosinline2等于3ECB模式,等于4CBC模式
        if (optionsRadiosinline.equals("1")) {
            //SM4设置加密密钥
            SM4 s4 = new SM4();
            SM4_Context ctx = new SM4_Context();
            ctx.isPadding = true;
            ctx.mode = SM4.SM4_ENCRYPT;
            byte[] keyBytes = s.getBytes();
            s4.sm4_setkey_enc(ctx, keyBytes);
            if (optionsRadiosinline2.equals("3")) {
                //ECB模式
                String path = "";
                //等于5上传保存服务器,等于6上传操作后下载
                if (optionsRadiosinline3.equals("5")) {
                    path = "F:\\MyEclipse 9Workspaces\\sm\\smfile\\";
                } else {
                    path = "F:\\MyEclipse 9Workspaces\\sm\\smfiledown\\";
                }
                File file = new File(path + filename + ".encecb");
                if (file.exists()) {
                    file.delete();
                    file.createNewFile();
                }
                FileOutputStream out = new FileOutputStream(file);
                out.write(s4.sm4_crypt_ecb(ctx, input), 0,
                    s4.sm4_crypt_ecb(ctx, input).length);
                out.close();
            } else {
                //CBC模式
                String path = "";
                if (optionsRadiosinline3.equals("5")) {
                    path = "F:\\MyEclipse 9Workspaces\\sm\\smfile\\";
                } else {
                    path = "F:\\MyEclipse 9Workspaces\\sm\\smfiledown\\";
                }
                File file = new File(path + filename + ".enccbc");
                FileOutputStream out = new FileOutputStream(file);
                out.write(s4.sm4_crypt_cbc(ctx, keyBytes, input), 0,
                    s4.sm4_crypt_cbc(ctx, keyBytes, input).length);
                out.close();
            }
        } else {
            //解密操作
            //SM4设置加密密钥
            SM4 s4 = new SM4();
            SM4_Context ctx = new SM4_Context();
            ctx.isPadding = true;
            ctx.mode = SM4.SM4_DECRYPT;
            byte[] keyBytes = s.getBytes();
            s4.sm4_setkey_dec(ctx, keyBytes);
            if (optionsRadiosinline2.equals("3")) {
                //ECB模式
                String path = "";
                //等于5上传保存服务器,等于6上传操作后下载
                if (optionsRadiosinline3.equals("5")) {
                    path = "F:\\MyEclipse 9Workspaces\\sm\\smfile\\";
                } else {
                    path = "F:\\MyEclipse 9Workspaces\\sm\\smfiledown\\";
                }
                File file = new File(path
                        + filename.substring(0, filename.lastIndexOf(".")));
                if (file.exists()) {
                    file.delete();
                    file.createNewFile();
                }
                FileOutputStream out = new FileOutputStream(file);
                out.write(s4.sm4_crypt_ecb(ctx, input), 0,
                    s4.sm4_crypt_ecb(ctx, input).length);
                out.close();
            } else {
                //CBC模式
                String path = "";
                if (optionsRadiosinline3.equals("5")) {
                    path = "F:\\MyEclipse 9Workspaces\\sm\\smfile\\";
                } else {
                    path = "F:\\MyEclipse 9Workspaces\\sm\\smfiledown\\";
                }
                File file = new File(path
                        + filename.substring(0, filename.lastIndexOf(".")));
                FileOutputStream out = new FileOutputStream(file);
                out.write(s4.sm4_crypt_cbc(ctx, keyBytes, input), 0,
                    s4.sm4_crypt_cbc(ctx, keyBytes, input).length);
                out.close();
            }
        }


    }


   

}


HTTP接口Content-Type解析原理与生产环境避坑指南 在Web开发与微服务架构中,HTTP协议是系统间通信的基石,而Content-Type头部字段则是确保数据正确解析的关键。它本质上属于MIME类型规范,用于明确告知接收方请求体或响应体的数据格式与编码方式。其工作原理是,后端框架(如Spring Boot的HttpMessageConverter)会根据Content-Type值匹配对应的解析器,将网络字节流转换为程序内部对象。这项技术的核心价值在于保障接口通信的准确性与安全性,避免因数据格式错配导致的解析失败、业务逻辑混乱乃至安全漏洞。典型的应用场景包括R 阅读详情

相关推荐

EDA工具安装第一步:Synopsys Installer的配置与图形化界面使用详解

本文详细解析了EDA工具安装的关键第一步——Synopsys Installer的配置与使用。文章阐述了其作为统一部署管理器和依赖协调者的核心作用,并分步详解了如何通过图形化界面高效安装EDA工具,同时介绍了命令行批处理等进阶技巧,旨在帮助工程师快速搭建稳定的芯片设计环境。

zeta9的博客 341

JavaWeb 2024 实战:3 种表单数据提交方式对比与 5 个常见错误排查

本文深入解析JavaWeb开发中GET/POST请求、文件上传和Ajax提交三种表单数据提交方式的实战应用,对比其性能与安全性,并提供5个常见错误排查方案。内容涵盖中文乱码处理、文件大小限制、重复提交防护等实用技巧,帮助开发者提升表单处理效率与安全性。

weixin_34289454的博客 378

从零到一:如何用YOLOv8和PyQt5打造你的第一个花卉识别桌面应用

本文详细介绍了如何使用YOLOv8和PyQt5从零开始构建一个花卉识别桌面应用。涵盖环境搭建、数据准备、模型训练、界面设计、模型集成与性能优化等全流程,帮助开发者快速掌握深度学习目标识别技术的实际应用。

weixin_29048775的博客 454

AI应用文件上传与流式响应难题:会话缓存与对象存储解耦方案

在构建集成大模型的现代Web应用时,文件上传与流式响应是常见的核心技术组合。文件上传通常涉及临时文件的生命周期管理,而流式响应则依赖于长连接的请求上下文。当用户需要基于已上传文件进行多次AI交互(如重新生成回答)时,两者在资源管理上容易产生冲突,导致文件访问失效或连接异常。这一问题的技术本质在于请求生命周期与资源状态的耦合。通过引入会话级缓存(如Redis)和外部对象存储(如OSS),可以将文件标识与用户会话绑定,使AI处理接口基于稳定的文件Key而非易失的临时路径工作,从而实现文件资源的可靠复用。这种架构

weixin_34284188的博客 522

告别虚拟机!在Windows上用WSL+VSCode搞定ArduPilot开发环境(保姆级避坑指南)

本文提供了一份详细的保姆级指南,介绍如何在Windows上使用WSL和VSCode搭建高效的ArduPilot开发环境,告别虚拟机性能损耗。从WSL安装、VSCode配置到ArduPilot固件编译和调试技巧,涵盖开发全流程中的关键步骤和常见问题解决方案,帮助无人机开发者快速构建专业级开发环境。

weixin_42543046的博客 461

元数据管理:DataHub和OpenMetadata对比分析

DataHub和OpenMetadata都试图解决数据编目,搜索,发现,治理和质量方面的相同问题。这两种工具都是出于为需要支持大量数据源、团队和用例的大型组织解决这些问题而诞生的。尽管这些工具在发布历史和成熟度方面略有不同,但它们的功能存在显着重叠。

weixin_38030820的博客 6633

问题记录:multipart/form-data 文件上传表单中传递参数无法获取

通过这种方法获取的两个参数值均为空,通过查询资料得知,在使用enctype="multipart/form-data"后请求的请求体信息已经改变,不能直接通过getParameter是获取不到的.①application/x-www-form-urlencoded:默认的编码方式。但是在用文本的传输和MP3等大型文件的时候,使用这种编码就显得 效率低下。③text/plain:纯文体的传输。enctype:规定了form表单在发送到服务器时候编码方式,它有如下的三个值。###Servlet内。

qq_52686660的博客 914

多标签学习模型(一):Multi Label Knn

1.什么是多标签分类问题 2.传统的KNN算法 3.为什么传统的KNN算法不能够处理多标签问题 4.ML KNN的推导 5.ML KNN是如何解决多标签问题的 6.总结

weixin_42892235的博客 2606

记录一次ajax中使用formdata(文件和其他参数一起上传)

记录一次ajax中使用formdata(文件和其他参数一起上传)问题来源具体描述1. 文件上传代码功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchar...

weixin_43120901的博客 2286

数字电路与逻辑设计实验二 组合逻辑电路

1.组合逻辑电路功能测试 (1)用 2 片 74LS00 组成图 2.1 所示逻辑电路。为便于接线和检查,在图中要注明 芯片编号及各引脚对应的编号。 (2)图中 A、B、C 接逻辑开关,Y1,Y2 接发光管电平显示。 (3)按表 2.3 要求,改变 A、B、C 输入的状态,填表并写出 Y1,Y2 的逻辑表达式。 (4)将运算结果与实验结果进行比较。 2.测试用异或门(74LS86)和与非门组成的半加器的逻辑功能。 根据半加器的逻辑表达式可知,半加 器 Y 是 A、B 的异或,而进位 Z 是 A

欢迎交流学习心得 1278

机器人控制仿真软件:MATLAB Simulink Control System Toolbox_(1).MATLAB基础知识

MATLAB(Matrix Laboratory)是由MathWorks公司开发的一种高性能数值计算和可视化软件。它广泛应用于科学计算、工程设计、信号处理、控制系统设计、图像处理等领域。强大的矩阵运算能力:MATLAB的核心是矩阵运算,能够高效处理大规模的数值数据。丰富的工具箱:MATLAB提供了大量的工具箱,如Control System Toolbox、Simulink、Signal Processing Toolbox等,这些工具箱覆盖了多个应用领域。易于使用的图形界面。

kkchenjj的博客 905

前端用FormData做上传后端无法获取数据的问题

今日在用SSM做上传时,在Controller层一直无法获取前端传递的数据,先贴上代码。 前端代码 <script type="text/javascript"> $(function (){ $("#btnUpFile").on("click",function (){ //1、获取要上传的文件资源 var upfile = $("#file")[0].files[0];

qq_43241190的博客 7282

Python爬虫实战:基于Playwright与异步技术的专利数据抓取系统

专利数据是企业技术创新、市场竞争分析和行业趋势预测的关键情报来源。然而,专利数据通常分散在各个国家的专利局网站,数据结构复杂,反爬机制严格,使得高效抓取成为技术挑战。本文将详细介绍如何构建一个基于最新Python技术的专利数据抓取系统,涵盖Selenium的现代化替代方案Playwright、异步编程、智能代理轮换等高级技术。

2201_76125261的博客 1562

formData多文件+表单ajax上传,后台接收不到数据解决方案

关于formData相关要点

qq_17790883的博客 3311

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

通过ajax上传multipart文件

使用FormData对象,是可以使用一系列的键值对来模拟一个完整的表单,然后使用XMLHttpRequest发送这个"表单"。 html: upload javascript: $.ajax({ url: "/upload", type: 'POST', cache: false, data: new FormData($("#

无尾鱼的博客 2万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Spring Boot文件上传服务:从安全风险到生产级实现

文件上传是Web开发中的基础功能,其核心机制基于HTTP协议的multipart/form-data编码,允许在单个请求中传输表单数据和文件二进制流。理解这一原理是构建健壮服务的基础,它直接关系到服务器资源管理、数据解析效率与安全性。在技术价值层面,一个设计良好的上传服务不仅能提升用户体验,更是系统安全的重要防线,能有效抵御恶意文件上传、目录遍历等常见攻击。其应用场景广泛,涵盖用户头像、产品图片、文档附件等各类业务凭证的存储与分发。本文聚焦于使用Spring Boot框架,深入探讨如何通过白名单校验、文件重

weixin_30314793的博客 347

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

关于SpringMVC content-type的那些事

最近项目上有一个小需求就是在form表单中上传一个excel文件,然后controller中对上传的excel数据进行读取然后执行dao操作 前端代码如下: 导入商品 js代码: //批量上传文件 function fileChange(target) { if (target.files && target.files[0]) { var file = target.

lovin_fang的专栏 2094

通过Ajax方式上传文件,使用FormData进行Ajax请求

通过传统的form表单提交的方式上传文件: 测试通过Rest接口上传文件 指定文件名: 上传文件: 关键字1: 关键字2: 关键字3: 不过传统的form表单提交会导致页面刷新,但是在有些情况下,我们不希望页面被刷新,这种时候我们都是使用Ajax的方式进行请求的。

Inuyasha1121的专栏 7万+

ajax formData 上传文件,Servlet 获取文件和参数的方式

Content-Type="application/x-www-form-urlencoded" 时,可以直接使用request.getParamter()获取参数。这里contentType设置为false就行,似乎会默认转为:multipart/form-data。公司项目框架比较老,遇到一个上传文件的问题,记录一下解决方式。将requset转换一次即可通过。如果参数中不传文件,但是。如果参数中不传文件,即。

风间琉璃c 2967

java ajax 找不到文件名_ajax获取不到file 这是为什么呢

该楼层疑似违规已被系统折叠隐藏此楼查看此楼分享我下的实现方式function submitImgSize1Upload(){var option={type:'POST',url:'${pageContext.request.contextPath }/upload/uploadPic.do',dataType:'text',data:{fileName : 'imgSize1File'},su...

weixin_39780260的博客 297

ajax提交文件 后台获取,Ajax提交含有文件type='file'标签的表单时候,后台获取不到值...

开发过程中,在遇到form中含有文件上传时候,通过ajax与后台交互,后台不能获取到传过去的文件,试了很多方法,最终用这段代码解决了,代码如下html代码:js代码:var form = document.getElementById("importForm");//importForm是form的idvar formdata = new FormData(form);//重点$.ajax({ur...

weixin_39574868的博客 808

Web后端—带文件和文本数据的form表单,使用Ajax的FormData获取表单数据上传到servlet,后端调用写的工具类FormPostUtil接收文件文本数据,最后存储到数据库中。

问题分析: 当前端form表单传数据到后端时,会有一个非常棘手的问题:数据里面有没有文件数据呢??因为有与没有的处理方式是不一样的。现在就设计前端使用Ajax申请技术,后端接收请求的同时自动判断form表单数据有没有文件数据,如果有文件数据就就要处理文件流保存到指定路径。 那么如何去判断form表单传来的数据有没有包含文件流呢?这里使用的思想和工具是FileItem类 、ServletFileUpload 类、DiskFileItemFactory类。 使用这三个工具就可以把前端form表单中的所有

每天八杯水的博客 2807

jsp上传文件,form表单提交数据enctype="multipart/form-data"时servlet获取不到type=“text”的数据问题...

在上传文件用了commons fileupload组件的情况下,servlet接收的数据只能是type=file表单元素类型,那么获取type=text类型,就可以使用parseRequest(request)来获取list,fileitem,判断isFormField,为true非file类型的。就可以处理了。下面是处理的部分代码: DiskFileItemFactory facto...

ahot8440的博客 435

原生servlet使用fileupload获取不到数据

fileupload官网网址:可以去查看详细的文档,也有实例代码FileUpload – Homehttp://commons.apache.org/proper/commons-fileupload/ 项目环境:我的前端使用vue写的,后端是用原生的servlet写的 upload.parseRequest(req); 这一条语句本该获取到一个List,可是我获取到的确是空的。百度很多都说是因为被自动转换或者是被过滤,但是他们的环境都是ssm,或者springboot,我这个是原生servlet.

李闪闪 1714

通过form表单文件上传,后台获取不到文件

通过form表单文件上传,后台获取不到文件 今天在工作中遇到了后台获取不到文件的问题,概述如下: 我用Java写了一个文件上传的方法,并作为接口提供给外部使用,Controller中代码如下: /** * 文件上传 * @since ...

dianle9968的博客 1478

【java小白入门】servlet获取ajax传入的FormData参数

之前用springboot+mybatis做过excel文件上传,之后又尝试着用比较原始的servlet和ajax来实现文件上传的功能,两种方式的思想是一致的,只是在传参和获取参数的方式上有一些区别。 注意:servlet无法向springmvc或者springboot一样直接利用MultipartFile对象来获取上传的文件对象,需要得到文件的路径才能对其进行操作,而现代浏览器为了保护用户的隐...

decade72的博客 1万+
上一篇: Android基础与应用 数据存储与访问
下一篇: ajax上传文件,spring mvc获取文件并处理,通过页面按钮发送url,由后台控制文件下载
Walter Sun
博客等级 码龄9年 1726粉丝 288原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Walter Sun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值