SpringMVC 通过ajax 实现文件的上传

使用form表单在springmvc 项目中上传文件,文件上传成功之后往往会跳转到其他的页面。但是有的时候,文件上传成功的同时,并不需要进行页面的跳转,可以通过ajax来实现文件的上传

下面我们来看看如何来实现:

方式1:前台从dom对象中获取到文件,并且将文件解析为Blob ,我们来看看页面代码:

<input type="file" class="inputPic" />

  javascript代码:

$(".inputPic").change(function() {var serviceUrl = "http://localhost:8070/file/";var url = serviceUrl + "/upload_aj";var form = new FormData();var file=$(".inputPic")[0].files;console.log(file[0].name)form.append("myfile", new Blob(file));form.append("filename", file[0].name);var xhr = new XMLHttpRequest(); xhr.open("post", url, true); // poxhr.upload.onloadstart = function() {// 上传开始执行方法ot = new Date().getTime(); // 设置上传开始时间oloaded = 0;// 设置上传开始时,以上传的文件大小为0};xhr.send(form); // 开始上传,发送form数据xhr.responseText = function(res) {console.log(res);}xhr.onreadystatechange = function(response) {console.log(response);if (response.target.readyState == '4') {var result = JSON.parse(response.target.response);console.log(result)if (Number(result.data) == 0) {alert(result.msg);} else {alert("图片上传成功");}}}});</script>

后台:

	@ResponseBody@RequestMapping(value = "upload_aj", method = RequestMethod.POST)public Map<String, Object> upload_aj(HttpServletRequest request, @RequestParam("myfile") MultipartFile file) {try {String filename=request.getParameter("filename");byte[] bytes = file.getBytes();System.out.println(filename);Path path = Paths.get("保存路径/"+filename);Files.write(path, bytes);} catch (Exception e) {e.printStackTrace();}Map<String, Object> map = new HashMap<>();map.put("msg", "文件上传成功");map.put("code", "0000");return map;}

方式2:前端将文件转换为base64,然后上传到后台:

前端代码:

	<input type="file" class="inputPic" />

javascript代码:

	$(".inputPic").change(function() {var serviceUrl = "http://localhost:8070/file/";var url = serviceUrl + "/upload_aj";var form = new FormData();var file=$(".inputPic")[0].files;console.log(file[0].name)form.append("myfile", new Blob(file));form.append("filename", file[0].name);var xhr = new XMLHttpRequest(); xhr.open("post", url, true); // poxhr.upload.onloadstart = function() {// 上传开始执行方法ot = new Date().getTime(); // 设置上传开始时间oloaded = 0;// 设置上传开始时,以上传的文件大小为0};xhr.send(form); // 开始上传,发送form数据xhr.responseText = function(res) {console.log(res);}xhr.onreadystatechange = function(response) {console.log(response);if (response.target.readyState == '4') {var result = JSON.parse(response.target.response);console.log(result)if (Number(result.data) == 0) {alert(result.msg);} else {alert("图片上传成功");}}}});

后端代码:

	@ResponseBody@RequestMapping(value = "upload_base", method = RequestMethod.POST)public Map<String, Object> upload_base(@RequestBody Map<String,Object> reqMap){try {String filename=reqMap.get("filename")+"";String filestr=reqMap.get("filestr")+"";System.out.println(filestr);	Base64FileConverter.decodeBase64ToFile(filestr,"C:\\upload/"+filename);} catch (Exception e) {e.printStackTrace();}Map<String, Object> map = new HashMap<>();map.put("msg", "文件上传成功");map.put("code", "0000");return map;}

 工具类:

import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Base64;public class Base64FileConverter {/*** 将 Base64 字符串解码并写入文件* @param base64String 包含文件数据的 Base64 字符串* @param outputFilePath 输出文件的路径* @throws IOException 如果文件操作出错*/public static void decodeBase64ToFile(String base64String, String outputFilePath) throws IOException {// 检查 Base64 字符串是否包含 MIME 类型前缀(如 data:image/jpeg;base64,)String pureBase64 = base64String;int commaIndex = base64String.indexOf(',');if (commaIndex > 0) {pureBase64 = base64String.substring(commaIndex + 1);}// 解码 Base64 字符串byte[] fileData = Base64.getDecoder().decode(pureBase64);// 写入文件try (FileOutputStream fos = new FileOutputStream(outputFilePath)) {fos.write(fileData);System.out.println("文件已成功写入: " + outputFilePath);}}/*** 将文件编码为 Base64 字符串* @param filePath 文件路径* @return 文件的 Base64 编码字符串* @throws IOException 如果文件操作出错*/public static String encodeFileToBase64(String filePath) throws IOException {byte[] fileData = Files.readAllBytes(Paths.get(filePath));return Base64.getEncoder().encodeToString(fileData);}}

上面就是对文件上传的通过ajax来实现的步骤,希望对你有所帮助

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/906492.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker安装Fluentd采集中间件

Fluentd 简介 &#xff1a;Fluentd 是一个高性能、可扩展的数据收集与聚合工具&#xff0c;能够统一数据收集和消费&#xff0c;实现各种数据源到各种数据接收器的高效传输&#xff0c;广泛应用于日志收集等领域。 功能特点 &#xff1a; 统一日志收集 &#xff1a;支持从各种…

07SpringMVC底层形象解析

目录 一、基于餐厅比喻的代码示例 &#xff0c;帮助你理解各组件间的协作关系 1. DispatcherServlet 配置&#xff08;服务员&#xff09; 2. HandlerMapping 配置&#xff08;菜单索引&#xff09; 3. Controller 实现&#xff08;厨师&#xff09; 4. Service 层&#x…

eclipse 生成函数说明注释

在Eclipse中生成函数说明注释&#xff08;JavaDoc风格&#xff09;可以通过以下方法实现&#xff1a; 快捷键方式&#xff1a; 将光标放在函数上方输入/**后按回车键Eclipse会自动生成包含参数和返回值的注释模板 菜单方式&#xff1a; 选中函数点击菜单栏 Source > Gen…

【题解-洛谷】P6180 [USACO15DEC] Breed Counting S

题目:P6180 [USACO15DEC] Breed Counting S 题目描述 Farmer John 的 N N N 头奶牛,从左到右编号为 1 …

基于Android的XX校园交流APP

开发语言&#xff1a;Java框架&#xff1a;ssmAndroidJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat12开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.3.9 系统展示 APP登录 APP首页…

25、工业防火墙 - 工控网络保护 (模拟) - /安全与维护组件/industrial-firewall-dcs-protection

76个工业组件库示例汇总 工业防火墙 - 工控网络保护 (模拟) 概述 这是一个交互式的 Web 组件,旨在模拟工业防火墙在保护关键工控网络(特别是 DCS - 分布式控制系统)免受网络攻击(如勒索软件传播)方面的核心功能。组件通过可视化简化的网络拓扑、模拟网络流量、应用防火…

kotlin flow的两种SharingStarted策略的区别

一 两种 SharingStarted 策略的区别&#xff1a; SharingStarted.Eagerly: 立即开始收集上游流&#xff0c;即使没有下游订阅者持续保持活跃状态&#xff0c;直到 ViewModel 被清除优点&#xff1a;响应更快&#xff0c;数据始终保持最新缺点&#xff1a;消耗更多资源&#x…

Windows_RustRover Rust语言开发环境构建

Windows_RustRover Rust语言开发环境构建 一、Rust语言简介&#xff08;一&#xff09;起源与发展&#xff08;二&#xff09;语言特点&#xff08;三&#xff09;应用场景&#xff08;四&#xff09;社区与生态 二、RustRover&#xff08;一&#xff09;主要功能&#xff08;二…

XCOSnTh-fatfsShell

#include "XCOSnTh.h" #include "ff.h" #include "stdio.h" static char pwd[1024]"1:"; static char pwdCount2; FRESULT lsExe(char *path,int(*printf)(const char* format, ...)) {FRESULT res;DIR dir;FILINFO fno;// 打开根目录…

篇章十 消息持久化(二)

目录 1.消息持久化-创建MessageFileManger类 1.1 创建一个类 1.2 创建关于路径的方法 1.3 定义内部类 1.4 实现消息统计文件读写 1.5 实现创建消息目录和文件 1.6 实现删除消息目录和文件 1.7 实现消息序列化 1. 消息序列化的一些概念&#xff1a; 2. 方案选择&#xf…

中间件-seata

分布式事务seata 角色组成角色指责AT模式TCC模式 角色组成 TC&#xff1a;事务协调者&#xff0c;维护全局和分支事务的状态&#xff0c;驱动全局事务提交或回滚。TM&#xff1a;事务管理者&#xff0c;定义全局事务的范围&#xff1a;开始全局事务、提交或回滚全局事务。RM&am…

python代码绘制某只股票最近90天的K线图、均线、量能图

运行代码&#xff0c;要求输入股票代码和名称&#xff0c;其他参数可省略 import akshare as ak import matplotlib.pyplot as plt import pandas as pd import mplfinance as mpf import matplotlib.dates as mdates import numpy as np import os from datetime import date…

Xilinx 7Series\UltraScale 在线升级FLASH STARTUPE2和STARTUPE3使用

一、FPGA 在线升级 FPGA 在线升级FLASH时&#xff0c;一般是通过逻辑生成SPI接口操作FLASH&#xff0c;当然也可以通过其他SOC经FPGA操作FLASH&#xff0c;那么FPGA就要实现在启动后对FLASH的控制。 对于7Series FPGA&#xff0c;只有CCLK是专用引脚&#xff0c;SPI接口均为普…

Azure 应用服务中的异常处理、日志记录和通知:综合指南

简介 Azure 应用服务是基于云的应用程序&#xff0c;使开发人员能够在云上构建、部署和管理应用程序。与任何应用程序一样&#xff0c;制定适当的异常处理、日志记录和通知实践至关重要&#xff0c;以确保应用程序平稳运行&#xff0c;并快速识别和解决任何问题。在本篇博文中&…

Java 应用如何实现 HTTPS:加密数据传输的实用指南

Java 应用如何实现 HTTPS&#xff1a;加密数据传输的实用指南 在当今的互联网环境中&#xff0c;数据安全至关重要&#xff0c;HTTPS 作为加密的数据传输协议&#xff0c;为 Java 应用提供了安全通信的保障。本文将深入探讨 Java 应用如何实现 HTTPS&#xff0c;通过详细代码实…

域名与DNS详解

域名与DNS详解 一、核心概念 域名&#xff08;Domain Name&#xff09; 定义&#xff1a;人类可读的网络地址标识&#xff08;如 www.google.com&#xff09;作用&#xff1a;替代复杂IP地址&#xff08;类似"手机通讯录"功能&#xff09; DNS&#xff08;Domain …

c++20引入的三路比较操作符<=>

目录 一、简介 二、三向比较的返回类型 2.1 std::strong_ordering 2.2 std::weak_ordering 2.3 std::partial_ordering 三、对基础类型的支持 四、自动生成的比较运算符函数 4.1 std::rel_ops的作用 4.2 使用<> 五、兼容他旧代码 一、简介 c20引入了三路比较操…

计算机网络相关面试题

一、HTTP1.1和HTTP2的区别 HTTP/1&#xff08;主要指 HTTP/1.1&#xff09;和 HTTP/2 是 Web 协议发展中的两个重要版本&#xff0c;二者在性能、协议机制和功能特性上有显著差异。以下从多个维度对比分析&#xff0c;并结合具体案例说明&#xff1a; 一、连接与请求处理方式 1…

图论算法精解(Java 实现):从基础到高频面试题

一、图的基础表示方法 1.1 邻接矩阵&#xff08;Adjacency Matrix&#xff09; 邻接矩阵是表示图的一种直观方式&#xff0c;它使用一个二维数组来存储节点之间的连接关系。对于一个有 n 个节点的图&#xff0c;邻接矩阵是一个 nn 的矩阵&#xff0c;其中 matrix [i][j] 表示…

江科大TIM定时器hal库实现

定时器相关hal库函数 hal库的定时器函数相比于标准库&#xff0c;多了很多的中断回调函数&#xff0c;同时对于定时器的初始化也改成使用句柄一次性顺带连带DMA等功能一起初始化了 typedef struct {uint32_t Prescaler; /*定时器的预分频值*/uint32_t CounterMode; …