base64字符串是包含文件格式的文件字符串,例如:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAgAElEQVR4Xsy9+……

根据base64字符串可以转化成真实的文件。思路是,首先将base64字符串读取城字节数组;然后将字节数组读入到字节流(内存流);其次将base64字符串开头部分包含的文件格式提取出来,得到文件类型并转换成相应后缀名;最后,根据字节流和文件类型,即可转化成相应的文件,并保存到物理磁盘。

特别是最近玩AngularJS时候,用到图片上传,裁剪图片保存功能,需要用到ngImgCrop裁剪图片控件。它就是将图片裁剪后保存成base64字符串结果的。

示例:base64编码的文本转为图片

/// <summary>
/// base64编码的文本转为图片
/// </summary>
/// <param name="base64"></param>
/// <returns></returns>
private static Image Base64StringToImage(string base64)
{
  byte[] bytes = Convert.FromBase64String(base64);
  using (MemoryStream ms = new MemoryStream(bytes))
  {
    Bitmap bmp = new Bitmap(ms);
    return bmp;
  }
}

示例:获取base64字符串开头部分包含的文件格式

var m = new Regex(@"(?<=data\:)[\w\/_\.]+(?=\;)", RegexOptions.IgnoreCase).Match(byteStr);
string ContentType = null != m ? m.Value : "image/png";

示例:获取文件大小

/// <summary>
/// 获取文件/文件夹大小(字节)
/// </summary>
/// <param name="filePath">路径</param>
/// <returns></returns>
private static long FileSize(string filePath)
{
  long temp = 0;

  //路径是否是文件
  if (File.Exists(filePath) == false)
  {

    //文件目录
    string[] entries = Directory.GetFileSystemEntries(filePath);
    foreach (string item in entries)
    {

      //遍历文件目录内的所有子文件目录,子文件
      temp += FileSize(item);
    }
  }
  else
  {
    FileInfo fileInfo = new FileInfo(filePath);
    return fileInfo.Length; //获取真实文件的大小(字节)
  }
  return temp;
}

全部代码:

 public class FileUploadResultModel
 {
     public Guid FileID { get; set; }
     public long FileSize { get; set; }
 }

 public static class Base64FileHandle
 {
     /// <summary>
     /// base64编码的文本转为图片
     /// </summary>
     /// <param name="base64"></param>
     /// <returns></returns>
     private static Image Base64StringToImage(string base64)
     {
         byte[] bytes = Convert.FromBase64String(base64);
         using (MemoryStream ms = new MemoryStream(bytes))
         {
             Bitmap bmp = new Bitmap(ms);
             return bmp;
         }
     }
     /// <summary>
     /// 获取文件/文件夹大小(字节)
     /// </summary>
     /// <param name="filePath">路径</param>
     /// <returns></returns>
     private static long FileSize(string filePath)
     {
         ;
         if (File.Exists(filePath) == false)
         {
             string[] entries = Directory.GetFileSystemEntries(filePath);
             foreach (string item in entries)
             {
                 temp += FileSize(item);
             }
         }
         else
         {
             FileInfo fileInfo = new FileInfo(filePath);
             return fileInfo.Length;
         }
         return temp;
     }
     private static string SuffixName(string ContentType)
     {
         switch (ContentType.Trim().ToLower())
         {
             case "image/jpg":
             case "image/jpeg":
                 return ".jpg";

             case "image/gif":
                 return ".gif";
             case "image/bmp":
                 return ".bmp";
             case "image/png":
                 return ".png";
             default:
                 return "";
         }
     }

     /// <summary>
     /// 创建圈子
     /// </summary>
     /// <param name="community"></param>
     /// <returns></returns>
     public static ResponseModel<FileUploadResultModel> ngImgCropHandle(string base64)
     {
         var response = new ResponseModel<FileUploadResultModel>() { IsLogin = true };

         string byteStr = base64.Trim();//data:image/png;base64,
         ;
         string str = byteStr.Substring(delLength, byteStr.Length - delLength);
         Image returnImage = Base64StringToImage(str);

         var m = new Regex(@"(?<=data\:)[\w\/_\.]+(?=\;)", RegexOptions.IgnoreCase).Match(byteStr);
         string ContentType = null != m ? m.Value : "image/png";

         Guid filename = Guid.NewGuid();
         string filepath = @"D:\wwwroot\" + filename + SuffixName(ContentType);
         returnImage.Save(filepath);

         response.Data = new FileUploadResultModel() { FileID = filename, FileSize = FileSize(filepath) };
         response.Success = true;
         response.Message = "ok";
         return response;
     }

 }

base64字符串转文件,以及ngImgCrop裁剪图片并上传保存到服务器示例的更多相关文章

  1. HTML5裁剪图片并上传至服务器实现原理讲解

    HTML5裁剪图片并上传至服务器实现原理讲解   经常做项目需要本地上传图片裁剪并上传服务器,比如会议头像等功能,但以前实现这类需求都很复杂,往往需要先把图片上传到服务器,然后返回给用户,让用户确定裁 ...

  2. HTML5 本地裁剪图片并上传至服务器(转)

    很多情况下用户上传的图片都需要经过裁剪,比如头像啊什么的.但以前实现这类需求都很复杂,往往需要先把图片上传到服务器,然后返回给用户,让用户确定裁剪坐标,发送给服务器,服务器裁剪完再返回给用户,来回需要 ...

  3. Android -- 图片异步上传到PHP服务器

    背景                                                                                           网上很多上传到 ...

  4. cropper实现基本的裁剪图片并上传

    使用cropper之前需要先引用 cropper.css 和 cropper.js cropper 官网:https://fengyuanchen.github.io/cropper/ cropper ...

  5. ASP.NET MVC4使用JCrop裁剪图片并上传

    需要用到的jquery插件Jcrop .Jquery.form 百度webuploader插件( http://fex.baidu.com/webuploader/ ) 引用下载好的css和js文件 ...

  6. jquery photoClip支持手机端,PC端 本地裁剪图片后上传插件

    支持手机,PC最好的是jquery photoClip插件,下载地址&示例:https://github.com/topoadmin/photoClip demo.html 代码: <! ...

  7. PHP裁剪图片并上传完整demo

    日前根据功能需求,要做一个图片裁剪上传的功能,在网上找了好久,找到了这位仁兄写的demo! 下载压缩包

  8. 图片裁剪 cropper.js 上传组件封装 vue

    //HTML cropper.js 文档地址: https://github.com/fengyuanchen/cropperjs/blob/master/README.md <template ...

  9. 图片压缩上传Thumbnailator 插件

    一,接口已经写死 public static String upload(String appCode, MultipartFile inputFile) public static String u ...

随机推荐

  1. Rich Text Editor for MVC

    在网站开发中难免会用到富文本编辑器,本文将介绍一款富文本编辑器(在线HTML编辑器) Rich Text Editor ,简要说明一下其在MVC中的使用. 具体使用情况和下载地址请参考:http:// ...

  2. 正确使用HTML title属性

    如果你想对使用手机,平板电脑和辅助技术的用户隐藏某些内容,而只对键盘用户显示,那么请使用title属性. 细节 HTML的title属性本身有问题.之所以有问题是因为它在一些重要的方面表现的不够好,尽 ...

  3. JAVA Socket传输Object(对象)注意的问题

    在java中,可以通过socket将一个对象进行传递,通过ObjectOutputStream,ObjectInputStream来进行写入和读取(具体的方法参考http://blog.csdn.ne ...

  4. java并发之线程执行器(Executor)

    线程执行器和不使用线程执行器的对比(优缺点) 1.线程执行器分离了任务的创建和执行,通过使用执行器,只需要实现Runnable接口的对象,然后把这些对象发送给执行器即可. 2.使用线程池来提高程序的性 ...

  5. Errors running builder &#39;DeploymentBuilder&#39; on project &#39;工程名&#39;

    打开myEclipse就会报 Errors running builder 'DeploymentBuilder' on project '工程名' xxxNullpointException 的错误 ...

  6. IBOS二次开发之视图创建(PHP技术)

    在 views 文件夹,我们创建一个跟控制器名称一样的文件夹list,新建一个index.php的视图文件. 我们讨论过多次,最后决定IBOS的视图机制还是以高效为主.因此我们没有使用模板,而是直接使 ...

  7. mybatis 之数据库 include refid =&quot;base_column_list&quot;

    mybatis 之数据库 include refid ="base_column_list" 对于刚学习使用SSM框架的新手来说,mybatis中的数据库语句有点不一样,下面便是对 ...

  8. 结合之前看的一些东西,阅读RockMQ实战与原理解析笔记

    Topic有多个message queue,消息可以并行的向各个message queue发送,消费者也可以并行的从多个message queue读取消息并消费 clustering模式消费一个top ...

  9. netstat -na 查看有大量TIME_WAIT解决办法(修改内核参数)

    # netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c      16 CLOSING     130 ESTABLISHED     298 FIN_WA ...

  10. kali 解决Metasploit拿到shell后显示中文乱码问题

    拿到对方shell后显示的问题如下: 中文乱码解决: chcp 65001 然后 上传下载文件