c# 用Base64實(shí)現(xiàn)文件上傳
Base64是網(wǎng)絡(luò)上最常見的用于傳輸8Bit字節(jié)碼的編碼方式之一,它是一種基于64個(gè)可打印字符來表示二進(jìn)制數(shù)據(jù)的方法。
使用base64進(jìn)行文件上傳的具體流程是:前臺(tái)使用js將文件轉(zhuǎn)換為base64格式,后臺(tái)通過高級(jí)編程語言,將base64格式的文件,轉(zhuǎn)換為原文件。下面就來演示一下,C#語言配合js,如何實(shí)現(xiàn)圖片的base64格式上傳與解析保存。
首先看一下前臺(tái)是如何將文件讀取到的,請(qǐng)先看如下js代碼:
var DataforUp = ""; var reader = new FileReader(); //聲明文件讀取對(duì)象 //聲明文件讀取完畢后調(diào)用的方法,通過this.result獲取到轉(zhuǎn)換的數(shù)據(jù)對(duì)象 reader.onload = function () { DataforUp = this.result; }; //當(dāng)用戶選擇文件后,進(jìn)行轉(zhuǎn)換數(shù)據(jù)的操作 $("#file").change(function () { reader.readAsDataURL(this.files[0]); });
文件的讀取,需要借助于FileReader這個(gè)對(duì)象,DataforUp用于保存base64源碼。#file該id對(duì)應(yīng)文件選擇標(biāo)簽。
FileReader對(duì)象有個(gè)onload事件,當(dāng)讀取文件的時(shí)候(或者說調(diào)用readAsDataURL方法后),會(huì)觸發(fā)此事件,base64轉(zhuǎn)換的源碼就存在于它的result屬性中。
下面具體解釋一下上述代碼:
當(dāng)用戶選擇文件后,使用FileReader對(duì)象讀取文件,讀取后自動(dòng)轉(zhuǎn)換為base64格式,然后觸發(fā)該對(duì)象的onload方法,將轉(zhuǎn)換后的base64源碼保存下來。
這樣我們就拿到了base64格式的文件源碼,通過ajax,就可以將文件發(fā)送到后臺(tái)。
接下來看一下后臺(tái)是如何解析并保存的:
public string SaveImgBaseSixFour(string img,string obj) { if(img==null){ return "數(shù)據(jù)為空"; } string result = img; int index = -1; //判斷是不是base64文件類型 index = img.IndexOf("base64,"); if (index != -1) { index += 7; //將數(shù)據(jù)轉(zhuǎn)換為二進(jìn)制字節(jié)數(shù)組 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標(biāo)識(shí)文件類型,緊接著base64,開頭的文件源碼最后以=結(jié)束,所以解析的時(shí)候要去掉開頭這一部分,本案例圖片擴(kuò)展名是寫死的,也可以通過base64文件頭去獲取圖片的擴(kuò)展名,此處不再詳細(xì)介紹。
解析一下代碼流程:
判斷文件是否為空,然后獲取到真正數(shù)據(jù)的開始索引,然后調(diào)用Convert.FromBase64String方法將base64轉(zhuǎn)換為原文件,然后通過文件流將內(nèi)存中保存的文件數(shù)據(jù)真實(shí)保存到本地。具體使用方法,讀者可自行查閱官方文檔,此處不再贅述。
以上就是c# 用Base64實(shí)現(xiàn)文件上傳的詳細(xì)內(nèi)容,更多關(guān)于c# Base64文件上傳的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解析數(shù)字簽名的substring結(jié)構(gòu)(獲取數(shù)字簽名時(shí)間)
解析數(shù)字簽名的substring結(jié)構(gòu),大家參考使用吧2013-12-12C#實(shí)現(xiàn)根據(jù)字節(jié)數(shù)截取字符串并加上省略號(hào)的方法
這篇文章主要介紹了C#實(shí)現(xiàn)根據(jù)字節(jié)數(shù)截取字符串并加上省略號(hào)的方法,比較實(shí)用的功能,需要的朋友可以參考下2014-07-07C#實(shí)現(xiàn)托盤程序并禁止多個(gè)應(yīng)用實(shí)例運(yùn)行的方法
這篇文章主要介紹了C#實(shí)現(xiàn)托盤程序并禁止多個(gè)應(yīng)用實(shí)例運(yùn)行的方法,涉及C#中NotifyIcon控件的使用及設(shè)置標(biāo)志位控制程序只運(yùn)行一個(gè)的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11如何在C#中使用 CancellationToken 處理異步任務(wù)
這篇文章主要介紹了如何在C#中使用 CancellationToken 處理異步任務(wù),幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-03-03C#使用迭代器實(shí)現(xiàn)文字動(dòng)態(tài)效果的示例代碼
這篇文章主要為大家詳細(xì)介紹了C#如何通過使用迭代器實(shí)現(xiàn)文字動(dòng)態(tài)效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02