使用七牛云进行上传图片

news2024/12/29 2:02:30

首先我们需要明确上传图片的注意点是什么?
1、表单组件标签只能用<input type="file">

2、上传图片必须采用post请求
get:参数通过请求头提交到后台,参数放到url后面来提交的只能向后台提交文本数据或者字符串数据,二进制如以字节为单位存储的只能用post,url长度有限制,长度超过限制无法提交;效率高,不需要对数据进行封装,还存在get缓存的问题(可以通过加时间戳来解决这个问题),减轻了后台处理请求的压力。
post:参数通过请求体提交到后台;能提交文本数据,又能提交二进制数据。理论上对参数长度没有限制,相对安全。效率相对较低,不管处理什么数据,什么路径都会从服务器重新来一遍。

3、表单的编码格式只能用:multipart/form-data
根据HTTP协议的规定,浏览器每次向后台提交参数,都会对参数进行统一编码:默认采用的编码格式是urlencoded,这种编码格式只能对文本数据进行编码,浏览器每次向后台提交参数,都会首先把所有的参数转换成字符串,然后对这些数据统一进行urlencoded编码,不管前台发的是啥,浏览器统一会变成字符串,我们拿到的永远也是字符串。
文件上传的表单编码格式只能是:multipart/form-data 多样性的表单数据,阻止默认行为,提交的是什么数据,拿到的是什么数据。没有进行任何的编码。
怎么设置表单的编码格式呢?
前台数据,设置ajax的行为
processDate: false //设置ajax向后台提交参数之前,是否把参数统一转换为字符串:true
contentType:false,//设置ajax向后台提交参数之前,是否把参数的编码统一按urlencoded编码。
统一form表单发送的请求,请求是同步的。浏览器发送的是同步请求。
同步请求只能处理字符串数据。无法解析json对象,无法解析Object
接收文件数据,springmvc专门给我们提供了一个类用来接收客户端上传的文件,MultipartFile类,当文件传过来后,会自动的将请求体的文件封装到这个类的对象中。
springmvc怎么去拿文件到请求体中?
springmvc调用了一个内部的类去请求体拿文件,封装这个对象。
那一个类一开始没有放在spring(mvc)容器中,要调用这个方法必须创建这个对象,把类的对象创建好,如果没有创建好这个类,他也没法调用方法从请求体中拿到数据封装对象,他会自动去找文件。
这个类是文件上传解析器,将拿到的文件赋值给MultipartFile

使用第三方工具一般有三步骤

第一步:引入插件的配置文件
第二步:创建容器,放入插件
第三步:加载容器,调用工具函数

七牛云官方文档
七牛云是一个云存储服务提供商,可以用于储存和管理大量数据。FilePult.js是一种JavaScript库,可用于将文件上传到云存储服务。七牛云提供了与FilePut.js兼容的API,以便在使用FilePut.js上传文件时,可以将文件上传到七牛云。当使用FilePut.js上传文件时,可以使用七牛云提供的API密钥和密钥等信息进行身份验证,并通过API将文件上传到七牛云。因此,七牛云和FilePut.js之间是一种可以协同工作的关系。

导入maven

<dependency>
  <groupId>com.qiniu</groupId>
  <artifactId>qiniu-java-sdk</artifactId>
  <version>[7.7.0, 7.10.99]</version>
</dependency>

对象存储空间-地区
在这里插入图片描述

前端:

引入配置文件

<link rel="stylesheet" href="${ctx}/css/fileinput.min.css"></link>
	<script type="text/javascript" src="${ctx}/js/fileinput.js"></script>
	<!-- 对中文的支持 -->
	<script type="text/javascript" src="${ctx}/js/fileinput_locale_zh.js"></script>

添加容器

<tr>
										<td>上传商品图片:</td>
										<td>
											<input type="hidden" name="originalImg" id="originalImg"/>
											<form enctype="multipart/form-data">
												<input id="file-product" class="file" name="file" type="file" multiple
													   data-min-file-count="1">
											</form>
										</td>
									</tr>

调用工具函数

//================商品-图片上传==================
	/**
	 * 初始设置
	 *    language指定语言
	 *    uploadUrl指定文件上传的后台地址
	 *    allowedPreviewTypes允许上传文件的类型
	 */
	$('#file-product').fileinput({
		language: 'zh',
		uploadUrl: '${ctx}/fileUpload/save',
		allowedPreviewTypes: ['image', 'html', 'text', 'video', 'audio', 'flash']
	});
	/**
	 * 上传文件失败后 调用方法(回调函数)
	 */
	$('#file-product').on('fileuploaderror', function (event, data, previewId, index) {
		var form = data.form,
				files = data.files,
				extra = data.extra,
				response = data.response,
				reader = data.reader;

		console.log(data);
		console.log('File upload error');
	});
	/**
	 * 文件错误 比如文件类型错误 调用方法(回调函数)
	 */
	$('#file-product').on('fileerror', function (event, data) {
		console.log(data.id);
		console.log(data.index);
		console.log(data.file);
		console.log(data.reader);
		console.log(data.files);
	});
	/**
	 * 文件上传成功后 调用方法(回调函数)
	 */
	$('#file-product').on('fileuploaded', function (event, data, previewId, index) {
		var form = data.form,
				files = data.files,
				extra = data.extra,
				response = data.response,
				reader = data.reader;
		// 服务器文件地址
		// alert(data.response.fileUrl);
		// 将服务器文件地址设置至隐藏域
		$("#originalImg").val(data.response.fileUrl);
		console.log('File uploaded triggered');
	});
	//================商品-图片上传==================

后端:

pojo

 */
public class FileResult implements Serializable {
    
    // success字符串bootstrap file input必须包含该属性
    private String success;
    // error字符串bootstrap file input必须包含该属性
    private String error;
    // 描述信息
    private String message;
    // 文件路径
    private String fileUrl;

    public String getSuccess() {
        return success;
    }

    public void setSuccess(String success) {
        this.success = success;
    }

    public String getError() {
        return error;
    }

    public void setError(String error) {
        this.error = error;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getFileUrl() {
        return fileUrl;
    }

    public void setFileUrl(String fileUrl) {
        this.fileUrl = fileUrl;
    }
}

Controller

@Controller
@RequestMapping("/fileUpload")
public class UploadController {

	@Autowired
	private UploadService uploadService;

	/**
	 * 将上传的文件赋值给MultipartFile,然后重命名文件,使得每一个文件的名称都不重复,然后调用service方法上传这个文件到后台。
	 * 返回这个文件的信息,在前端得到响应信息判断文件上传是否成功,渲染页面。
	 * @param file
	 * @return
	 * @throws IOException
	 */
	@RequestMapping("/save")
	@ResponseBody
	public FileResult upload(MultipartFile file) throws IOException {
		String filename = file.getOriginalFilename();
		String date = DateTimeFormatter.ofPattern("yyyy/MM/dd/").format(LocalDateTime.now());
		filename = date+System.currentTimeMillis()+filename.substring(filename.lastIndexOf("."));
		return uploadService.upload(file.getInputStream(),filename);
	}

}

ServiceImpl

@Service("UploadService")
public class UploadServiceImpl implements UploadService {

	@Override
	public FileResult upload(InputStream inputStream, String fileName) {
		FileResult fileResult = new FileResult();
		//构造一个带指定 Region 对象的配置类
		Configuration cfg = new Configuration(Region.region2());
		//...其他参数参考类注释
		UploadManager uploadManager = new UploadManager(cfg);
		//...生成上传凭证,然后准备上传,密钥
		String accessKey = "3scC_cEM9rkaDmh-Nj7djoprxZMUCwqp47GpspS2";
		String secretKey = "GkC1lqSJXoZVwJxtiN-j81CES9uAsqkKMFhwZC5k";
		String bucket = "shop-wll";
		//默认不指定key的情况下,以文件内容的hash值作为文件名
		String key = fileName;
		System.out.println("文件上传....");
		try {
			Auth auth = Auth.create(accessKey, secretKey);
			String upToken = auth.uploadToken(bucket);
			try {
				Response response = uploadManager.put(inputStream,key,upToken,null, null);
				//解析上传成功的结果
				if (response.statusCode==200){
					fileResult.setSuccess("success");
					fileResult.setMessage("上传成功");
					fileResult.setFileUrl("http://ru4mmztz7.hn-bkt.clouddn.com/"+fileName);
					return fileResult;
				}else {
					fileResult.setError("error");
					fileResult.setMessage("上传失败");
					return fileResult;
				}
			} catch (QiniuException ex) {
				Response r = ex.response;
				System.err.println(r.toString());
				fileResult.setError("error");
				fileResult.setMessage("上传失败");
				try {
					System.err.println(r.bodyString());
				} catch (QiniuException ex2) {
					//ignore
				}
			}
		} catch (Exception ex) {
			//ignore
		}
		return fileResult;
	}
}

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

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

相关文章

基于物联网可移动医疗设备智能监测节能应用研讨

智慧医疗、全民健康一直是社会关注的热点之一。医疗卫生体系的发展水平关系到人民群众的身心健康和社会和谐&#xff0c;智慧医疗旨在通过物联网技术实现准确、实时感知医疗信息&#xff0c;并进行全面、科学分析&#xff0c;作出智慧的决策&#xff0c;从而提升医疗服务的信息…

黄金投资品种有哪些,如何选择黄金品种

黄金是国际性的硬通货&#xff0c;具有世界货币的地位和国际都认可的流通性&#xff0c;在金融投资市场中黄金也一直属于热门产品&#xff0c;是全球都认可的避险保值投资产品&#xff0c;人们不管是想保值还是向投资增值都是不错的选择&#xff0c;但黄金投资市场中产品种类多…

前端基于uniapp[uniPush]实现APP消息推送(安卓、IOS)

前提概述&#xff1a;此文章都是基于uniapp中uniPush2实现的在线、离线推送 app消息推送流程 登录开发者中心先填写好项目信息以及配置厂商在manifest.json文件中勾选推送模块在前端项目中创建云函数&#xff08;此云函数的作用是接受后台发送的消息模板&#xff0c;解析出来…

项目中常见的几种策略模式实现方式

前言 本篇文章主要介绍本人在自己项目中和开源项目中策略模式的实现方式 基于spring实现策略模式 最近在使用nacos-sync同步工具时发现其使用了策略模式&#xff0c;下面主要介绍它是如何使用的 实现步骤 2.1 定义接口&#xff1a;SyncService public interface SyncService …

交叉导轨具体应用在哪些领域?

交叉导轨通过采用缩短了滚柱体的间距的R型滚柱保持器这种独特的滚柱保持机制&#xff0c;使滚柱体的有效接触长度增大&#xff0c;且交叉导轨的安装高度更低&#xff0c;由于是两付导轨平行安装组合成为一套&#xff0c;使得交叉导轨的机台整体性要好于直线导轨&#xff0c;倾覆…

5 分钟教你如何免费用上 GPT-4

今天要分享的就是普通用户&#xff0c;没有 OpenAI 账号&#xff0c;不需要写代码&#xff0c;你依然可以免费体验 GPT-4&#xff0c;当然&#xff0c;会有一些缺点&#xff0c;本篇文章将会手把手教你怎么用上免费版的 GPT-4 以及它的一些限制。 第一步&#xff1a;打开 Stea…

嵌入式软考备考_5 嵌入式程序设计

嵌入式程序设计 开发流程 要想某个功能要用硬件还是软件实现&#xff08;硬件快&#xff0c;但是耗资源&#xff09;&#xff1f;BSP&#xff1f;裸机还是OS&#xff1f; 硬件的设计与实现-》设备驱动软件的设计与实现-》os的选择&#xff0c;移植&#xff0c;api接口函数的…

人工智能(Pytorch)搭建模型5-注意力机制模型的构建与GRU模型融合应用

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(Pytorch)搭建模型5-注意力机制模型的构建与GRU模型融合应用。注意力机制是一种神经网络模型&#xff0c;在序列到序列的任务中&#xff0c;可以帮助解决输入序列较长时难以获取全局信息的问题。该模型通过…

工具收集 - 键鼠模拟改建

工具收集 - 键鼠模拟&改建 AutoTinyFreeMouseClickerX-Mouse Button Control AutoTiny 官网&#xff1a;https://autotiny.cn AutoTiny软件是一款PC电脑端使用的自动化录制制作软件&#xff0c;不仅能够实现电脑自动化操作&#xff0c;而且可以控制手机实现自动化操作。 A…

uniApp 实现上传功能(七牛云,node获取上传token)

版本&#xff1a;uniAppvue2uview-ui 需求&#xff1a;利用uView_upload组件实现上传功能 难点&#xff1a;兼容性强&#xff0c;支持pc、App、h5&#xff1b; 1.使用leancloud 实现上传(兼容性弱) JS-SDK 只兼容pc、h5&#xff0c;运行到虚拟机上会报错——uniApp问答详情&am…

深度挖掘.c到.exe的整个过程,透过现象看本质

文章目录 程序的翻译环境和执行环境翻译环境编译预编译头文件的包含删除注释替换#define定义的符号 编译词法分析语法分析语义分析符号汇总 汇编 链接合并段表符号表的合并和重定位 执行环境 程序的翻译环境和执行环境 在ANSI C的任何一种实现中&#xff0c;存在两个不同的环境…

【Jenkins】使用java -jar jenkins.war --httpPort=XXXX启动Jenkins报错【解决方案】

使用java -jar jenkins.war --httpPortXXXX启动Jenkins报错【解决方案】 &#x1f449;欢迎关注博主【米码收割机】 &#x1f449;一起学习C、Python主流编程语言。 &#x1f449;机器人、人工智能等相关领域开发技术。 &#x1f449;主流开发、测试技能。 文章目录 使用java -…

学习分享|一文搞懂WiFi 6/7 以及选择路由器改造网络那些事

目录 什么是 WiFi 6 WiFi 6 功能特点 WIFI 6 与前几代对比 速度更快 延时更低 容量更大 更安全 更省电 WiFi 4~WiFi 6对比 WiFi 6 核心技术 WiFi 7 WiFi 世代列表 路由器常用技术扩展 2.5Ge 网口 WAN/LAN口复用/网口盲插 双WAN口 双LAN口端口聚合 mesh组网 聊…

实验四 文件系统原理与模拟实现

实验四 文件系统原理与模拟实现 代码资源地址 Java实现的混合索引和成组链接法算法资源-CSDN文库 实验目的&#xff1a; 了解操作系统中文件系统的结构和管理过程&#xff0c;掌握经典的算法&#xff1a;混合索引与成组链接法等方法。 实验内容&#xff1a; 编程模拟实现混合…

【Android取证篇】ADB版本更新详细步骤

【Android取证篇】ADB版本更新详细步骤 更新ADB版本&#xff0c;解决无法连接设备问题【蘇小沐】 ADB没有自动更新的命令&#xff0c;我们需要下载新的ADB进行替换更新。 1、ADB查找 打开任务管理器&#xff08;快捷键shiftctrlEsc或WinX&#xff09;&#xff0c;在“详细信…

Arcgis通过矢量建筑面找到POI对应的标准地址

背景 有时候我们需要找到POI对应的标准地址,也许有很多的方法, 比如通过POI的地址数据和标准地址做匹配,用sql语句就能实现; 但是POI数据中也存在很多没有地址数据的,这时候只能通过空间关联来匹配对应的标准地址了,而空间关联也有不一样的方法,一个是通过空间连接,找…

数智化转型再加速,低代码开发助力企业转型

毫无疑问&#xff0c;随着数智化转型的加速&#xff0c;越来越多的企业正在把数智化战略提升到一个全新的高度&#xff0c;转型的进程也正从“浅层次”的数智化走向“深层次”数智化的阶段。 据权威机构数据统计&#xff0c;过去几年全球数字经济同比增长15.6%&#xff0c;采取…

DJ5-5/6 与设备无关的 I/O 软件、用户层的 I/O 软件

目录 5.5 与设备无关的 I/O 软件 5.5.1 与设备无关软件的概念 5.5.2 与设备无关的软件的功能 5.5.3 设备分配 5.5.4 逻辑设备名到物理设备名映射的实现 5.6 用户层的 I/O 软件 5.6.1 系统调用与库函数 5.6.2 假脱机技术 SPOOLing 5.5 与设备无关的 I/O 软件 …

鲲鹏昇腾开发者峰会2023举办

[2023年5月6日 广东东莞]今天&#xff0c;以“创未来 享非凡”为主题的鲲鹏昇腾开发者峰会2023在东莞松山湖举办。 鲲鹏产业生态繁荣&#xff0c;稳步发展&#xff0c;正在成为行业核心场景及科研领域首选&#xff0c;加速推动数字化转型&#xff1b;昇腾产业快速蓬勃向上&…

【大数据之Hadoop】二十五、生产调优-HDFS核心参数

1 NameNode内存生产配置 Hadoop3.x系列的NameNode内存是动态分配的&#xff0c;可以用jmap -heap 进程号 查看分配的内存。 在hadoop102中NameNode和DataNode的内存都是自动分配的&#xff0c;且相等。 根据经验&#xff1a; NameNode最小值为1G&#xff0c;每增加1百万个物理…