开发日常小结(10):项目如何使用图片服务器API?

基于c# net的分布式图片服务器项目 同过一个简单的小例子,演示了图片分布式存储在C# net MVC 中的使用 立即下载

2018年4月13日

运营姐姐来需求,想上传图片(活动推荐)给手游玩家,不然怎么推广和赚钱呢??经过努力,还是完成了,如下图所示:





【1】写个页面:添加文件

并不难,下面提供一个实例(js):

 <form class="form-horizontal" role="form" enctype="multipart/form-data" id="fileUploadForm" method="POST" action="${contextPath}/activity/addActivity">
					<table class="tableOne">
						<tr class="b-b-dc">
							<td class="width_150 padding-20 text-color-333 f16 text_center">活动信息</td>
							<td class="padding-20"><div class="b-r-dc height_90"></div></td>
							<td>
								<div class="alert alert-warning" align="left">
								提醒:<br>
								<br>1.活动的展示顺序由seq决定次序(seq越小,展示越早);<br>
								<br>2.若seq相同,则发布时间决定次序(发布时间越早,展示越早);<br>
								<br>3.活动的跳转类型项请根据实际情况选择;<br>
								<br>4.活动图片限制的上传格式为:宽度最大为 714,高度不限制,建议 483;
								</div>
								<div class="tableTwoDiv">
									<table class="tableTwo">							
										<tr>
											<td class="text_right width_130">活动名称:</td>
											<td>
												<input type="text"  autocomplete="off" class="form-control" id="name" name="name" placeholder="请输入活动名" value="" >								
											</td>
										</tr>
										<tr>
											<td class="text_right width_130">排序(seq):</td>
											<td>
												<input type="text"  autocomplete="off" class="form-control" id="seq" name = "seq" placeholder="请输入seq" value="" >							
											</td>
										</tr>
										<tr>
											<td class="text_right width_130">开始时间:</td>
											<td>
												<input type="text" class="form-control" id="startTime" name="startTime" placeholder="活动开始时间" value="" >							
											</td>
										</tr>
										<tr>
											<td class="text_right width_130">结束时间:</td>
											<td>
												<input type="text"  class="form-control" id="endTime" name="endTime" placeholder="活动结束时间" value="" >						
											</td>
										</tr>
										<tr>
											<td class="text_right width_130">跳转链接:</td>
											<td>
												<input type="text"  autocomplete="off" class="form-control" id="toUrl" name="toUrl" placeholder="活动跳转链接" value="">						
											</td>
										</tr>
										
										<tr>
											<td class="text_right width_130">跳转类型:</td>
											<td>
	    										<select id="urlType" name="urlType" class="from-input">
													 <c:forEach var="turnUrlList" items="${turnUrlList }">
														<option value="${turnUrlList.urlTypeValue }">${turnUrlList.urlType }</option>
													 </c:forEach>
												</select>
											</td>
										</tr>
										
										<tr>
											<td class="text_right width_130">发布时间:</td>
											<td>
												<input type="text" class="form-control" id="postTime" name="postTime" placeholder="选择发布时间" value="">						
											</td>
										</tr>
										
										<tr>
											<td class="text_right width_130">活动图片:</td>
											<td>
	    										<input type="file" id="fileUpload" name="pic" onchange="jsReadFiles(this.files)">
												<!-- <input type="text" class="form-control" id="imgUrl" placeholder="http://" value=""> -->
											</td>
										</tr>
										
									</table>
								</div>										
							</td>
						</tr>	
					</table>		
				</div>
				<div class="form-group height_80 m-t-20 m-l-100 m-b-50">
					<div class="col-sm-1 m-l-185">
						<a id="submitFrom" class="btn-defeult" onclick="edOpt.submitForm()">确认添加</a>
					</div>		
				</div>
				</form>

【2】获取文件流

			<script type="text/javascript">
					//js 读取图片文件,限制长度宽度
				    function jsReadFiles(files) {
				    	var width = 0;
				    	var height = 0;
				        if (files.length) {
				            var file = files[0];
				          	//alert("**********"+file.size);
				          	//读取图片数据
			                var reader = new FileReader();
			                reader.onload = function (e) {
			                    var data = e.target.result;
			                    //加载图片获取图片真实宽度和高度
			                    var image = new Image();
			                    image.onload=function(){
			                    	width  = image.width;
			                    	height = image.height;
			                    	if(width != 714){
							        	basic.alert("图片格式错误,上传尺寸的宽度必须为714,请重新上传图片!");
								        $("#fileUpload").val(null);
			                    		return ;
			                    	}else if(width == 714){
			                    		if(height != 0){
									    	basic.alert("格式正确,图片上传成功!");  
			                    		}
			                    	}
			                    };
			                    image.src= data;
			                };
			                reader.readAsDataURL(file);
			            }
				    }	
                    </script >

【3】上传表单:form表单

                                    submitForm:function(){
						var name = $("#name").val();
						
						if(name == ""){
							basic.message.topMessage("活动名称不为空!");
							return;
						};
				
						$("#fileUploadForm").submit();
						//请求地址
						/* var ajaxUrl = "${contextPath}/activity/addActivity" ;*/
					},

【4】重点1:Multipart文件接收

protected List<FileItem> fileItemList = null;		//上传文件项   
/**
	 * 从文件上传请求中获取普通参数
	 * @return 包含请求参数的map集合.文件上传项可从父类属性获取
	 */	
	protected Map<String, String> getParamsFromMultipartRequest(HttpServletRequest request){
		Map<String, String> params = new HashMap<>();
		try{
            //1、创建一个DiskFileItemFactory工厂  
            DiskFileItemFactory factory = new DiskFileItemFactory();  
            //2、创建一个文件上传解析器  
            ServletFileUpload upload = new ServletFileUpload(factory);  
            //解决上传文件名的中文乱码  
            upload.setHeaderEncoding("UTF-8");   
            //3、判断提交上来的数据是否是上传表单的数据  
            if(!ServletFileUpload.isMultipartContent(request)){  
                //按照传统方式获取数据  
            	this.sendFailMsg("上传文件失败");
            }  
           //4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项  
           List<FileItem> list = upload.parseRequest(request);  
           for(FileItem item : list){  
               //如果fileitem中封装的是普通输入项的数据  
               if(item.isFormField()){  
                   String fname = item.getFieldName(); 
                   String value = item.getString("UTF-8");  
                   if("".equals(fname)){
                	   continue;
                   }
                   params.put(fname, value);
                   //解决普通输入项的数据的中文乱码问题  
                   //value = new String(value.getBytes("iso8859-1"),"UTF-8");  
	            }else{//如果fileitem中封装的是上传文件  
	                   //得到上传的文件名称,
	            	if(fileItemList == null){
	            		fileItemList = new ArrayList<>();
	            	}
                   String filename = item.getName();  
                   if(filename==null || filename.trim().equals("")){  
                       continue;  
                   }
                   
                  //注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:  c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt  
                  //处理获取到的上传文件的文件名的路径部分,只保留文件名部分  
                  //获取item中的上传文件的输入流
                   fileItemList.add(item);
	              } 
	          }
	       }catch (Exception e) {  
	           System.out.println("文件上传失败:"+e.getMessage());
	       }
		return params;
	}

解释:

1  对于整个form表单提交上来后,先是使用了封装方法 getParamsFromMultipartRequest() 对 请求进行处理。

2  处理完数据后,添加进map中;如果包含了文件项,则fileItemList添加一个参数;


【5】重点2:通过ImageClient来上传图片即可

如果fileItemList不为空,那么将数据流和对象名称,用 uploadHessian() 上传文件。

		
		if(this.fileItemList != null && this.fileItemList.size() > 0){
			FileItem fileItem = this.fileItemList.get(0);
			String image_key = ImageClient.uploadHessian(fileItem.getInputStream(), fileItem.getName());
			imgUrl = ImageClient.getPic(image_key, null, null, null);
		}
【6】重点3:ImageClient

每个公司都会使用图片服务器,比如腾讯云、阿里云,华为云等等;ImageClient 其实是对第三方api进行的一个封装;ImageClient类是个工具类,包含了调用第三方api的方法。

举个例子(阿里云):

	/**
	 * 上传图片  返回图片key
	 * @param is
	 * @param fileName
	 * @return
	 */
	public static String uploadHessian(InputStream is,String fileName) {
		return AliImageClient.uploadHessian(is, fileName);
	}
	
【7】重点4:再往下就是阿里云的第三方api,这里涉及到敏感信息,便不再叙述;只要理解到一点,我们使用的是别人提供的服务,这种服务是非常难搞的(所以一般只有巨头有实力提供这种服务),图片服务器接口由第三方提供,通过上传数据流获取到key值,然后用api拿到存储在服务器(云端)的图片url。这个过程要理解。


.NET分布式编程(C#) .NET分布式编程(C#) .NET分布式编程(C#) .NET分布式编程(C#) 立即下载

相关推荐

C#网站图片服务器

利用WebClient 实现图片上传 剪切 缩放等一系列图片生成的操作类

超简单随机图片API制作教程

随机图片API制作教程,超简单,包会!

sevin的博客 5888

c# 开发串口调试助手 Visual Studio 2019

串口调试助手是用于在开发、测试和调试串口通信应用程序时进行串口数据的监视和交互的工具。

2301_76792852的博客 8060

制作个人图片api接口

制作个人图片api接口前言准备工作过程介绍操作过程上传图片到github仓库中在github中进行项目的发布编写php文件,引用jsDeliver上的文件在nginx配置文件中配置好php-fpm相关配置测试测试php配置测试图片api接口 前言 当我们需要在网站上显示随机图片时,会用到api接口,这时可以自己做一个图片api接口,就不用担心使用别人的api接口不稳定或对图片不满意等情况了 本篇文章是基于jsDeliver + github制作图片api接口 准备工作 一台配置好域名&证书的服务器 服务器

香蕉~不拿呐 5477

RC电路(一):微分|积分

的取值不同,会导致输出波形和输入波形之间的关系也不同,由此也会产生不同的应用。输出为0,随着电容充满电,运放-输入端得到的分压为正最大值,可等效成一个电压源,且电压不可突变,此时电流反向为最大值,开始充电时的容抗为0,电压不可突变则电压差为0,运放。开始充电时的容抗为0,电压不可突变则电压差为0,运放。输入端得到的分压也不可突变,随着电容放完电,于是。,因电容上电压不能突变(来不及充电,相当于短路,由上分析可得积分运算电路中,输出为运放的负最大峰值,随着电容充满电,输出为运放的正最大峰值,随着电容放完电,

既有随处可栖的江湖,也有追风逐梦的骁勇! 1万+

「极简」扣子(coze)教程 | 细节决定成败!这个小功能让用户满意度飙升,讲的太细了

这一期大师兄通过向扣子(coze)应用添加提示语的方法向用户显示系统运行的状态。

u014527622的博客 2111

微信小程序图片四个API用法

小程序的图片API主要是 wx.chooseImage 选择图片 wx.previewImage 预览图片 wx.getImageInfo 获取图片的信息 wx.saveImageToPhotosAlbum 保存图片 以下通过一个案例是四种API的使用方法 描述: 1. 首先选择本地图片保存到变量数组中,然后再页面中渲染图片。 2. 给每个图片一个事件,并用da...

yw00yw的博客 3696

升降机SEW MOVIDRIVE变频器设置

选择PO1 第2,3,9,13 位,点击“SendPA”Start reference,编码器反馈值为0(PI2/3 Actual position=0)提示:传送参考位置前请断开变频器安全24V电源,否则会弹出禁止修改提示框;提示:做这一步时,如果出现电机不能转动,或产生报警不能通过编码器匹配。下载配置的参数,提示:下载参数需要断开变频器的安全24V电源。编码器匹配通过后点击下一步,进入下图画面传送参考位置。1电机不能转动:a可能是由于变频器的安全24V未给。点击2.SEW总线扩展定位,定位块设置。

xdpcxq的专栏 5395

图片服务器

图片服务器项目,实现上传、展示、删除图片功能

weixin_45706903的博客 641

AI Agent的数据安全与隐私保护措施

AI Agent(人工智能代理)作为一种能够感知环境、做出决策并采取行动的智能实体,在现代社会的各个领域中得到了广泛的应用,如智能客服、自动驾驶、金融风险评估等。随着其应用的不断拓展,AI Agent处理和存储的数据量急剧增加,这些数据包含了大量的个人敏感信息和商业机密。因此,确保AI Agent的数据安全与隐私保护变得至关重要。本文的目的在于全面探讨AI Agent的数据安全与隐私保护措施,涵盖从数据的采集、存储、处理到传输的整个生命周期。

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 2866

镜头像差之五——场曲

什么是场曲? 场曲[curvature of field] 物面上所有的点经过系统后,最佳焦点位置不在同一平面上,若这些像点所成的面为曲面,则称为系统有场曲。 与物高二次方、入射光瞳口径一次方成正比的像差。若仅存在场曲,则所有物平面上的点都有相应的像点,但分布在一个球面上;若采用弯成此种形状的底片,则可获得处处清晰的像。此时在理想像平面上,像点呈现为圆斑。 第一张图是最简单也是最容易理解的场曲,也就是对焦点锐利,其余部分逐渐松散,但实际上大多现代镜头的场曲都呈现为图二的形态:对焦点与边缘锐度.

camerall 1万+

零基础编写图片服务器(3)

加油

weixin_61518137的博客 511

多径衰落信道的 MATLAB 仿真

在无线通信系统中,信号在传输过程中会经历多径传播现象,导致信号在接收端出现时域和频域上的扩展。通过以上示例代码,我们可以进行多径衰落信道的 MATLAB 仿真。同时,我们还可以通过调整信道参数和信号特性,进一步研究多径衰落对系统性能的影响。常用的模型之一是瑞利衰落信道模型,它假设信号在传输过程中受到多个散射路径的影响。除了瑞利衰落信道模型,我们还可以使用其他类型的信道模型,如高斯衰落信道模型。在上述代码中,我们首先定义了信道的参数,包括最大多普勒频移、多径延迟和多径功率衰落。函数来模拟高斯衰落信道。

TechCraze的博客 665

图床/图片服务器项目详细设计

项目目录1.前言1.1 项目背景1.2 项目意义1.3 涉及的知识点2.总体设计2.1 需求规定2.1.1 软件功能的规定2.1.1.1 系统功能2.1.1.2 数据流图2.1.1.3 数据字典2.1.2 性能的规定2.1.2.1 可靠性2.1.2.2 兼容性2.1.2.3 共享性2.1.2.4 可移植性3.系统设计3.1 数据库设计3.2 服务器API设计(前后端交互接口设计)3.2.1 新增图片(上传图片)3.2.2 查看所有图片信息(数据库里面存的属性信息)3.2.3 查看指定图片属性3.2.4 删除

qq_44330050的博客 2372

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

jre9下载 jdk9

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

android开发框架afinal使用方法小结

android开发框架afinal使用方法小结 投稿:lijiao 字体:[增加 减小] 类型:转载 时间:2016-11-06 我要评论 这篇文章主要为大家详细总结了android开发框架afinal使用方法,注解功能、文件上传下载功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了android afinal使用方法,供大家参考,具体内容如下

dianziagen的博客 1146

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

API安全测试检查项小结

现如今开发基本上都是,相比前端,后端的测试是最容易发现一些底层bug, 修复成本也低。今天主要聊聊接口的安全测试,以及常见的漏洞。

2301_78276982的博客 705

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

android 方法加final,android开发框架afinal使用方法小结

本文实例为大家分享了android afinal使用方法,供大家参考,具体内容如下1.注解功能1)继承:finalactivity ( 需要复制 afinal_0.5.1_bin.jar到lib下)2)@viewinject()public class afinalactivity extends finalactivity {@viewinject(id=r.id.bt_afinal_loadi...

weixin_36443680的博客 261

ArcGIS API for Silverlight开发入门(6):图层类型小结

在用SilverlightAPI开发的过程中,不论是从客户端提交到服务器端的数据,还是从服务器端返回客户端的数据,都要表现在浏览器中,具体的来说是Map控件里。但根据各自类型的不同,比如数据源,地图服务的类型,是否缓存等,决定了它们将处于某个图层里,前面讲过的GraphicsLayer就是一种图层。清楚地认识这些图层类型,对于处理于服务器与客户端之间的地图数据来说是很重要的。所有的图层都是从Lay

chenshizero的专栏 1132

Java EE Web开发与项目实战_Java EE WEB开发与项目实战

出版信息李俊青 / 华中科技大学出版社 / 2011-11 / 59.80元内容简介本书采用工程案例的形式,将日常Java EE项目开发所涉及的技术要点进行了解析,系统介绍了Apache的安装、Tomcat的安装、虚拟主机的配置、开发工具的搭配使用、验证码的使用、过滤器的使用、密码的加密与解密、JavaMail邮件发送、Web在线编辑器的使用、文件上传、数据库连接池、Ajax与Servlet的身份...

weixin_34331737的博客 436

【PHP开发900个实用技巧】534.人脸识别整合:PHP与计算机视觉API的结合

### PHP与视觉API结合的人脸识别开发指南:250字总结 PHP与视觉API的结合为人脸识别开发提供了高效解决方案。核心在于理解**RESTful API交互**,避免本地部署深度学习模型的误区。常见问题包括**API调用错误**(如参数格式和认证问题)和**密钥管理漏洞**(避免明文存储API Key)。优化方案包括使用**动态令牌**和**环境变量**确保安全,以及通过**图像预处理**(如GD库缩放和WebP压缩)提升传输效率。**活体检测**是防止照片攻击的关键,可通过动作指令、红外深度检测

1188

Restful API 学习之旅

长期以来,软件研究主要关注软件设计的分类、设计方法的演化,很少客观地评估不同的设计选择对系统行为的影响。而相反地,网络研究主要关注系统之间通信行为的细节、如何改进特定通信机制的表现,常常忽视了一个事实,那就是改变应用程序的互动风格比改变互动协议,对整体表现有更大的影响。RESTful API的提出就是想要在符合架构原理的前提下,理解和评估以网络为基础的应用软件的架构设计,得到一个功能强、性能好、...

爪哇人的博客 401

使用 Windows Mobile 5.0 中的图片、视频和照相机

适用于:Windows Mobile version 5.0Microsoft Visual Studio .NET 2005Microsoft .NET Compact Framework 版本 2.0摘要:学习 Windows Mobile 5.0 和 .NET Compact Framework 2.0 中新增的多媒体功能,并了解如何在您的企业应用程序中使用这些功能。本文通过

enginetanmary的专栏 2131
上一篇: 开发日常小结(14):项目小功能:实现倒计时功能(js实现),基于java数据传递
下一篇: 前端基础(13): jQuery的$("#id")和document.getElementById("id")的区别
后台技术汇
博客等级 码龄11年 670粉丝 531原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

后台技术汇

对你的帮助,是对我的最好鼓励。

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

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

打赏作者

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

抵扣说明:

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

余额充值