支持缩略图和水印。

using System;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Helpers; namespace HZC.Util.Mvc
{
public class MvcImageUploader
{
#region 字段
private string[] _imageExts = new string[] { "jpg", "jpeg", "png", "gif", "bmp" }; // 允许上传的图片类型
private string _basePath;
private string _baseLocalPath;
private int _fileLimitSize;
#endregion #region 构造函数
/// <summary>
/// MVC图片上传工具
/// </summary>
public MvcImageUploader() : this( * * , "/Upload/Pics")
{ } /// <summary>
/// MVC图片上传工具
/// </summary>
/// <param name="fileLimitSize">图片最大限制</param>
public MvcImageUploader(int fileLimitSize) : this(fileLimitSize, "/Upload/Pics")
{ } /// <summary>
/// MVC图片上传工具
/// </summary>
/// <param name="fileLimitSize">图片最大限制,默认2M</param>
/// <param name="basePath">图片上传路径,默认为 ~/Upload/Pics </param>
public MvcImageUploader(int fileLimitSize, string basePath)
{
_basePath = basePath;
_fileLimitSize = fileLimitSize;
_baseLocalPath = GetServerPath(_basePath);
}
#endregion #region 上传
public ImgUploadResult UploadImage(WebImage image, bool isThumb = true, bool isWater = false,
ThumbOption thumbOption = null, WaterOption waterOption = null)
{
if (image == null)
{
return new ImgUploadResult {
Code = ImgUploadResultCode.文件不存在,
Message = "请求中未检测到文件"
};
}
else
{
try
{
string extName = Path.GetExtension(image.FileName).ToLower();
int size = image.GetBytes().Length;
int width = image.Width;
int height = image.Height; // 验证文件类型
if (!ValidFileSize(size))
{
return new ImgUploadResult
{
Code = ImgUploadResultCode.文件大小超出限制,
Message = "文件大小超出限制"
};
} // 验证文件大小
if (!ValidExtName(extName))
{
return new ImgUploadResult
{
Code = ImgUploadResultCode.不受支持的文件类型,
Message = "不受支持的文件类型"
};
} var result = new ImgUploadResult(); // 图片位置相关
var folderName = GetImageUploadFolder(); // 图片文件夹名称
var newFileName = GetNewFileName(extName); // 随机生成的图片名称
var newFolderPath = Path.Combine(_baseLocalPath, folderName); // 图片文件夹在服务器上的物理路径
var newFilePath = Path.Combine(newFolderPath, newFileName); // 图片在服务器上保存的物理路径
var thumbFilePath = Path.Combine(_baseLocalPath, // 缩略图在服务器上保存的物理路径
folderName, "Thumbs", newFileName); if (!Directory.Exists(newFolderPath)) // 校验|创建图片文件夹
{
Directory.CreateDirectory(newFolderPath);
Directory.CreateDirectory(Path.Combine(newFolderPath, "Thumbs"));
} // 获取水印
if (isWater)
{
if (waterOption != null)
{
if (waterOption.Type == WaterType.图片)
{
// 图片水印
if (!string.IsNullOrWhiteSpace(waterOption.Content))
{
var path = GetServerPath(waterOption.Content);
if (File.Exists(path))
{
WebImage img = new WebImage(path);
int w = waterOption.Width > ? waterOption.Width : img.Width;
// int h = waterOption.Height > 0 ? waterOption.Height : img.Height;
var h = waterOption.Height;
if (h == )
{
h = img.Height * w / img.Width;
} image.AddImageWatermark(img, w, h,
waterOption.HorizontalPostion, waterOption.VerticalPostion,
waterOption.Opacity, waterOption.Padding);
}
}
}
else
{
// 文字水印
if (!string.IsNullOrWhiteSpace(waterOption.Content))
{ image.AddTextWatermark(waterOption.Content, waterOption.FontColor, waterOption.FontSize, waterOption.FontStyle,
waterOption.FontFamily, waterOption.HorizontalPostion, waterOption.VerticalPostion,
waterOption.Opacity, waterOption.Padding);
}
}
}
} image.Save(newFilePath); // 保存文件 result.Code = ImgUploadResultCode.上传成功;
result.Message = "";
result.ImageUrl = _basePath + "/" + folderName + "/" + newFileName;
result.ThumbUrl = "";
result.Size = size;
result.Width = width;
result.Height = height;
result.Ext = extName; // 缩略图
if (isThumb)
{
var thumb = MakeThumb(image, thumbOption);
thumb.Save(thumbFilePath);
result.ThumbUrl = _basePath + "/" + folderName + "/Thumbs/" + newFileName;
} return result;
}
catch (Exception ex)
{
SimpleLog.WriteErrorLogAsyn("UploaderController.Image", ex.Message + ":" + ex.StackTrace);
return new ImgUploadResult
{
Code = ImgUploadResultCode.系统异常,
Message = ex.Message + ":" + ex.StackTrace,
Size = ,
Ext = "",
ImageUrl = "",
ThumbUrl = "",
Width = ,
Height =
};
}
}
}
#endregion #region 生成缩略图
private WebImage MakeThumb(WebImage source, ThumbOption option = null)
{
if (option == null)
{
option = new ThumbOption();
} WebImage thumb;
if (option.IsCrop)
{
if (source.Width <= option.Width || source.Height <= option.Height)
{
thumb = source.Resize(option.Width, option.Height, true, true);
}
else
{
var wScale = source.Width / option.Width;
var hScale = source.Height / option.Height; var direct = ; // 0:横向;1:纵向 var thumbWidth = ;
var thumbHeight = ; if (wScale >= hScale)
{
direct = ;
thumbHeight = option.Height + ;
thumbWidth = option.Height * source.Width / source.Height;
}
else
{
direct = ;
thumbWidth = option.Width + ;
thumbHeight = option.Width * source.Height / source.Width;
} thumb = source.Resize(thumbWidth, thumbHeight, false, false); if (direct == )
{
var py = (thumbWidth - option.Width) / ;
thumb = thumb.Crop(, py, , py);
}
else
{
var py = (thumbHeight - option.Height) / ;
thumb = thumb.Crop(py, , py, );
}
}
}
else
{
thumb = source.Resize(option.Width, option.Height, true, true);
}
return thumb;
}
#endregion #region 获取图片的上传文件夹
private string GetImageUploadFolder()
{
string folderName = DateTime.Today.ToString("yyyyMM");
return folderName;
}
#endregion #region 获取文件上传后的文件名称
private string GetNewFileName(string ext)
{
string fileName = Path.GetRandomFileName();
return fileName + "." + ext;
}
#endregion #region 验证文件扩展名
private bool ValidExtName(string ext)
{
return _imageExts.Contains(ext);
}
#endregion #region 验证文件大小
private bool ValidFileSize(int size)
{
return size <= _fileLimitSize;
}
#endregion #region 获取指定路径在服务器上的位置
private string GetServerPath(string url)
{
url = url.ToLower();
if (url.StartsWith("http://") || url.StartsWith("https://"))
{
return url;
}
else if (HttpContext.Current != null)
{
return HttpContext.Current.Server.MapPath(url);
}
else
{
return string.Empty;
}
}
#endregion
} /// <summary>
/// 图片上传结果
/// </summary>
public class ImgUploadResult
{
/// <summary>
/// 结果码
/// </summary>
public ImgUploadResultCode Code { get; set; } /// <summary>
/// 消息
/// </summary>
public string Message { get; set; } /// <summary>
/// 图片上传成功后的相对路径,如:/Upload/Pic/...
/// </summary>
public string ImageUrl { get; set; } /// <summary>
/// 缩略图的相对路径
/// </summary>
public string ThumbUrl { get; set; } /// <summary>
/// 图片的扩展名
/// </summary>
public string Ext { get; set; } /// <summary>
/// 图片的大小
/// </summary>
public int Size { get; set; } /// <summary>
/// 图片的宽度
/// </summary>
public int Width { get; set; } /// <summary>
/// 图片的高度
/// </summary>
public int Height { get; set; }
} /// <summary>
/// 缩略图配置选项
/// </summary>
public class ThumbOption
{
/// <summary>
/// 缩略图宽度
/// </summary>
public int Width { get; set; } = ; /// <summary>
/// 缩略图高度
/// </summary>
public int Height { get; set; } = ; /// <summary>
/// 是否保持图片的宽高比
/// </summary>
public bool IsPreserveAspectRatio { get; set; } = true; /// <summary>
/// 是否阻止放大图片
/// </summary>
public bool IsPreventEnlarge { get; set; } = true; /// <summary>
/// 是否裁剪图片,
/// 如果裁剪,图片短边适应缩略图尺寸,自动缩放长边,并根据缩略图尺寸从中心裁剪长边
/// 如果裁剪,图片长边适应缩略图尺寸,短边按比例缩放
/// </summary>
public bool IsCrop { get; set; } = false;
} /// <summary>
/// 水印配置选项
/// </summary>
public class WaterOption
{
/// <summary>
/// 水印类型,图片|文字
/// </summary>
public WaterType Type { get; set; } /// <summary>
/// 水印内容,
/// 类型为图片时,传入水印图片相对根目录的路径,如:/Upload/Pics/201801/xxx.jpg
/// 类型为文字时,传入水印的文字
/// </summary>
public string Content { get; set; } /// <summary>
/// 水印的水平位置,
/// 可选为 Left|Center|Right
/// </summary>
public string HorizontalPostion { get; set; } = "Right"; /// <summary>
/// 水印的垂直位置,
/// 可选为 Top|Middle|Bottom
/// </summary>
public string VerticalPostion { get; set; } = "Bottom"; /// <summary>
/// 水印图片的宽度,仅当水印类型为图片时有效
/// </summary>
public int Width { get; set; } = ; /// <summary>
/// 水印图片的高度,仅当水印类型为图片时有效
/// </summary>
public int Height { get; set; } = ; /// <summary>
/// 水印的透明度,100为完全不透明,0为完全透明
/// </summary>
public int Opacity { get; set; } = ; /// <summary>
/// 边距大小
/// </summary>
public int Padding { get; set; } = ; /// <summary>
/// 水印文本的字体,仅当水印类型为文本时有效
/// 注意,若指定字体在服务器上不存在,会抛出报错
/// </summary>
public string FontFamily { get; set; } = "Microsoft Sans Serif"; /// <summary>
/// 水印文本的样式,仅当水印类型为文本时有效
/// 可选项目 Regular|Bold|Italic|Strikeout|Underline
/// </summary>
public string FontStyle { get; set; } = "Regular"; /// <summary>
/// 水印文本的文字大小,仅当水印类型为文本时有效
/// </summary>
public int FontSize { get; set; } = ; /// <summary>
/// 水印文本的文字颜色,仅当水印类型为文本时有效
/// 赋值类似于 "White"、"Black" 或 "DarkBlue",或 "#RRGGBB" 或 "#RGB" 形式的十六进制值
/// </summary>
public string FontColor { get; set; } = "Black";
} /// <summary>
/// 图片上传结果码的枚举
/// </summary>
public enum ImgUploadResultCode
{
不受支持的文件类型 = ,
文件大小超出限制 = ,
文件不存在 = ,
系统异常 = ,
上传成功 =
} /// <summary>
/// 水印类型的枚举
/// </summary>
public enum WaterType
{
文字 = ,
图片 =
}
}

上面是工具的代码,调用例子如下:

 [HttpPost]
public JsonResult ImageUpload()
{
if (HttpContext.Request.RequestType == "GET")
{
return Json(new ImgUploadResult { Code = ImgUploadResultCode.文件不存在 });
} ImgUploadResult result;
WebImage image = WebImage.GetImageFromRequest("");
if (image == null)
{
return Json(new ImgUploadResult { Code = ImgUploadResultCode.文件不存在 });
} MvcImageUploader uploader = new MvcImageUploader(); // 文字水印
result = uploader.UploadImage(image, true, true,
new ThumbOption { IsCrop = true },
new WaterOption
{
Content = "这是文字水印",
FontFamily = "微软雅黑",
FontSize = ,
FontColor = "#FF0000",
Padding = ,
HorizontalPostion = "Center",
VerticalPostion = "Middle",
Opacity =
}); // 图片水印
//result = uploader.UploadImage(image, true, true,
// new ThumbOption { IsCrop = true },
// new WaterOption
// {
// Type = WaterType.图片,
// Content = "/Upload/Pics/201801/cctv1.jpg",
// HorizontalPostion = "Center",
// VerticalPostion = "Middle",
// Width = 150
// });
return Json(result);
}

基于WebImage的图片上传工具类的更多相关文章

  1. PHP 图片上传工具类(支持多文件上传)

    ====================ImageUploadTool======================== <?php class ImageUploadTool { private ...

  2. ASP.NET 图片上传工具类 upload image简单好用功能齐全

    使用方法: UploadImage ui = new UploadImage(); /***可选参数***/ ui.SetWordWater = "哈哈";//文字水印 // ui ...

  3. spring mvc 文件上传工具类

    虽然文件上传在框架中,已经不是什么困难的事情了,但自己还是开发了一个文件上传工具类,是基于springmvc文件上传的. 工具类只需要传入需要的两个参数,就可以上传到任何想要上传的路径: 参数1:Ht ...

  4. spring boot 文件上传工具类(bug 已修改)

    以前的文件上传都是之前前辈写的,现在自己来写一个,大家可以看看,有什么问题可以在评论中提出来. 写的这个文件上传是在spring boot 2.0中测试的,测试了,可以正常上传,下面贴代码 第一步:引 ...

  5. 文件上传工具类 UploadUtil.java

    package com.util; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import ja ...

  6. FastDFS 文件上传工具类

    FastDFS文件上传工具类 import org.csource.common.NameValuePair; import org.csource.fastdfs.ClientGlobal; imp ...

  7. AFNetworking网络请求与图片上传工具(POST)

    AFNetworking网络请求与图片上传工具(POST) .h文件 #import <Foundation/Foundation.h> /** 成功Block */ typedef vo ...

  8. 基于Jcrop的图片上传裁剪加预览

    最近自己没事的时候研究了下图片上传,发现之前写的是有bug的,这里自己重新写了一个! 1.页面结构 <!DOCTYPE html> <html lang="en" ...

  9. [图床神器]Windows下的图片上传工具MPic

    最近用hexo在github上搭建了一个静态博客,开始几天用起来感觉还挺好的,但是用了些天就觉得每次写文章插入图片就非常麻烦,而且如果图片多了的话上传和访问就很慢了.后来网上看了下发现mac下有款ip ...

随机推荐

  1. eclipse——Maven创建JavaWeb工程

    打包方式改为war 问题:webapp目录下缺少web.xml文件 先勾选掉Dynamic Web Services 点击Applay 再勾选上Dynamic Web Services ,目的是为了产 ...

  2. Cloud Design Patterns: Prescriptive Architecture Guidance for Cloud Applications

    January 2014 Containing twenty-four design patterns and ten related guidance topics, this guide arti ...

  3. Linux下的strerror是否线程安全?

    下列是glibc-2.14中的源代码: 点击(此处)折叠或打开 char * strerror (errnum) int errnum; { char *ret = __strerror_r (err ...

  4. Java String对象面试题分析

  5. 史融资2.5亿的“自主国产”红芯浏览器,其实是个套壳Chrome

    红芯浏览器 今天早上看到朋友发的浏览器图片,感觉很好奇,然后就看了下,感觉文章还不错,就转发了下,然后下载浏览器着实花了不小心思,最后文末添加了红芯浏览器转存在蓝奏云盘的下载连接了. 文章原文 今天又 ...

  6. httpClient-3.1学习笔记

    http://hc.apache.org/httpclient-3.x/tutorial.htmlThe general process for using HttpClient consists o ...

  7. Python - selenium_WebDriver 页面元素操作

    代码是自己写了 python WebDriver  页面操作的常用方法. from selenium import webdriver import time driver = webdriver.F ...

  8. 国外物联网平台(8):Telit

    国外物联网平台(8) ——Telit 马智 定位 We Bring IoT to Life Telit提供世界上最全面的高性能物联网模块.连接服务和软件. 产品体系 模块 Telit提供丰富专业的物联 ...

  9. WPF 控件库——仿制Chrome的ColorPicker

    WPF 控件库系列博文地址: WPF 控件库——仿制Chrome的ColorPicker WPF 控件库——仿制Windows10的进度条 WPF 控件库——轮播控件 WPF 控件库——带有惯性的Sc ...

  10. 「TJOI2013」攻击装置

    题目链接 戳我 \(solution\) 这道题和网络24题之骑士共存问题很相似 只是输入方式不一样而已 详细见:这儿 \(Code\) #include<bits/stdc++.h> # ...