Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,它是一种基于64个可打印字符来表示二进制数据的方法。

使用base64进行文件上传的具体流程是:前台使用js将文件转换为base64格式,后台通过高级编程语言,将base64格式的文件,转换为原文件。下面就来演示一下,C#语言配合js,如何实现图片的base64格式上传与解析保存。

首先看一下前台是如何将文件读取到的,请先看如下js代码:

var DataforUp = "";
var reader = new FileReader(); //声明文件读取对象
//声明文件读取完毕后调用的方法,通过this.result获取到转换的数据对象
reader.onload = function () {
DataforUp = this.result;
};
//当用户选择文件后,进行转换数据的操作
$("#file").change(function () {
reader.readAsDataURL(this.files[0]);
});
 

文件的读取,需要借助于FileReader这个对象,DataforUp用于保存base64源码。#file该id对应文件选择标签。

FileReader对象有个onload事件,当读取文件的时候(或者说调用readAsDataURL方法后),会触发此事件,base64转换的源码就存在于它的result属性中。

下面具体解释一下上述代码:

当用户选择文件后,使用FileReader对象读取文件,读取后自动转换为base64格式,然后触发该对象的onload方法,将转换后的base64源码保存下来。

这样我们就拿到了base64格式的文件源码,通过ajax,就可以将文件发送到后台。

接下来看一下后台是如何解析并保存的:

public string SaveImgBaseSixFour(string img,string obj)
{
if(img==null){
return "数据为空";
}
string result = img;
int index = -1;
//判断是不是base64文件类型
index = img.IndexOf("base64,");
if (index != -1)
{
index += 7;
//将数据转换为二进制字节数组
var imgbit = Convert.FromBase64String(img.Substring(index));
//生成文件名
string imgname = DateTime.Now.ToString("yyyyMMddHHmmss") + ".jpg";
//保存图片
using (Image image=Image.FromStream(new MemoryStream(imgbit)))
{
image.Save(_rootPath+imgname,ImageFormat.Jpeg);
}
}
}
 

base64源码的基本模型是 data:image/png;base64,...文件码...=

data标识文件类型,紧接着base64,开头的文件源码最后以=结束,所以解析的时候要去掉开头这一部分,本案例图片扩展名是写死的,也可以通过base64文件头去获取图片的扩展名,此处不再详细介绍。

解析一下代码流程:

判断文件是否为空,然后获取到真正数据的开始索引,然后调用Convert.FromBase64String方法将base64转换为原文件,然后通过文件流将内存中保存的文件数据真实保存到本地​。具体使用方法,读者可自行查阅官方文档,此处不再赘述​。

 这是我公众号二维码

 

Base64文件上传(Use C#)的更多相关文章

  1. base64文件上传的问题

    package com.zhicall.media.util; import java.io.FileInputStream; import java.io.FileOutputStream; imp ...

  2. .netcore 文件上传转为base64位字符串

    .netcore文件上传Api接口,和正常的webForm提交类似,只是用postman测试接口时,记得给form表单命名,否则获取上传文件数量一直为0 后端代码 using System; usin ...

  3. vue + element 文件上传 并将文件转 base64

    当时有一个需求 是需要用到上传文件这个功能,并且需要将文件转为 base64 给到后台.网上找的全是啥图片转base64 肯定是因为这类需求比较常见.当时有点懵了.后面一想,都他娘是文件啊.然后就找到 ...

  4. 文件上传 和 base64编码

    base64编码 1.关于Base64编码  :  https://www.cnblogs.com/liyiwen/p/3814968.html (个人猜测),file表单发送文件,肯定是将文件转换为 ...

  5. 文件上传三:base64编码上传

    介绍三种上传方式: 文件上传一:伪刷新上传 文件上传二:FormData上传 文件上传三:base64编码上传 Flash的方式也玩过,现在不推荐用了. 优点: 1.浏览器可以马上展示图像,不需要先上 ...

  6. chunkupload文件上传断点续传组件(java)

    chunkupload简介 chunkupload是一款基于java语言的断点续传组件,针对文件上传,非文件下载,集成方便,使用简单. 从整体上讲,chunkupload会对文件进行切片处理,每个切片 ...

  7. chunkupload 文件上传断点续传组件(java) - 正式发布

    chunkupload简介 chunkupload是一款基于java语言的断点续传组件,针对文件上传,非文件下载,集成方便,使用简单. chunkupload实现如下功能: ·  实现断点续传 ·  ...

  8. Selenium2学习-039-WebUI自动化实战实例-文件上传下载

    通常在 WebUI 自动化测试过程中必然会涉及到文件上传的自动化测试需求,而开发在进行相应的技术实现是不同的,粗略可划分为两类:input标签类(类型为file)和非input标签类(例如:div.a ...

  9. SpringMVC 文件上传&拦截器&异常处理

    文件上传 Spring MVC 为文件上传提供了直接的支持,这种支持是通过即插即用的 MultipartResolver 实现的.Spring 用 Jakarta Commons FileUpload ...

随机推荐

  1. Nodejs学习笔记(4) 文件操作 fs 及 express 上传

    目录 参考资料 1. fs 模块 1.1 读取文件fs.readFile 1.2 写入文件fs.writeFile 1.3 获取文件信息fs.stat 1.4 删除文件fs.unlink 1.5 读取 ...

  2. Django1和2的区别

    一.路由的区别 1.Django1中的url from django.conf.urls import url # 使用url关键字 urlpatterns = [ url('article-(\d+ ...

  3. Java8 Stream 中 List 转 Map 问题总结

    在使用 Java 的新特性 Collectors.toMap() 将 List 转换为 Map 时存在一些不容易发现的问题,这里总结一下备查. 空指针风险 java.lang.NullPointerE ...

  4. Amundsen在REA Group公司的应用实践

    REA Group是一家专门面向房地产与实业资产的跨国数字广告公司. 他们主要为消费者提供房地产购买.出售与租赁服务,同时发布各类房产新闻.装修技巧以及生活方式层面的内容.每一天,都有数百万消费者访问 ...

  5. 「HTML+CSS」--自定义按钮样式【004】

    前言 Hello!小伙伴! 首先非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 哈哈 自我介绍一下 昵称:海轰 标签:程序猿一只|C++选手|学生 简介:因C语言结识编程,随后转入计算机 ...

  6. 北航OO第三单元作业总结(3.1~3.3)

    JML简介及相关工具链使用 1.JML规格描述语言介绍 本单元学习的内容是JML规格描述语言.我们知道,面向对象方法是一个抽象过程,需求者仅需关注方法的规格.规格是对一个方法/类/程序的外部可感知行为 ...

  7. Centos下搭建DNS域名解析服务器

    Centos下搭建DNS域名解析服务器 DNS  即Domain Name System(域名系统)的缩写,它是一种将ip地址转换成对应的主机名或将主机名转换成与之相对应ip地址的一种机制.其中通过域 ...

  8. get_started_3dsctf_2016-Pwn

    get_started_3dsctf_2016-Pwn 这个题确实有点坑,在本地能打,在远程就不能打了,于是我就换了另一种方法来做. 确这个题是没有动态链接库,且PIE是关的,所以程序的大部分地址已经 ...

  9. 设计原则:接口隔离原则(ISP)

    接口隔离原则的英文是Interface Segregation Principle,缩写就是ISP.与里氏替换原则一样其定义同样有两种 定义1: Clients should not be force ...

  10. shell脚本 3 流程控制

    shell流程控制 流程控制是改变程序运行顺序的指令.linux shell有一套自己的流程控制语句,其中包括条件语句(if),循环语句(for,while),选择语句(case).下面我将通过例子介 ...