图片上传根据stream生成image

对于图片上传代码的整合

因为需要判断上传的图片的宽高是否符合尺寸,所以在最初拿到inputstream的时候,就直接获取image格式的图片

本来是想在下面的checkFile中获取的,不过直接使用System.Drawing.Image.FromStream(request.PostedFile.InputStream);的时候报错了,错误意思是说参数为空,应该是由于上面获取byte[]file的时候,关闭了stream,导致request.PostFile.InputStream也没有了,所以直接在IO中读取数据流的时候获取image格式对象

突然想起来还有个 image和bitmap之间的转换:

因为png格式的需要使用bitmap保存的方式

Image originalImage = Image.FromFile(originalImagePath);
Bitmap oriImg = new Bitmap(originalImage);

public class UploadService
{
    public bool SaveAs(UploadRequest request, out string filePath, out string errMessage)
        {
            filePath = string.Empty;

            //**************************************初始化byte长度.
            byte[] file = new Byte[request.PostedFile.ContentLength];
            //**************************************读取stream,并转换为byte类型以及获取image类型
            System.IO.Stream stream = request.PostedFile.InputStream;
            stream.Read(file, 0, request.PostedFile.ContentLength);
            Image image = System.Drawing.Image.FromStream(stream);
            stream.Close();
            //**************************************判断条件
            if(!CheckFile(request,image, file, out errMessage)){
                return false;
            }
            //**************************************设置路径
            SetFile(ref request);
            filePath = request.SavePath;
            //**************************************保存至文件路径
            var fs = new FileStream(filePath, FileMode.Create, FileAccess.Write);
            fs.Write(file, 0, file.Length);
            fs.Flush();
            fs.Close();

            //**************************************获取相对路径
            filePath = GetSimplePath(filePath);
            if (string.IsNullOrEmpty(errMessage))
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// 判断文件的相关条件
        /// </summary>
        /// <param name="request"></param>
        /// <param name="file"></param>
        /// <param name="errMessage"></param>
        /// <returns></returns>
        private bool CheckFile(UploadRequest request,Image image, byte[] file, out string errMessage)
        {
            errMessage = string.Empty;
            // 读取原始文件名
            string localFileName = Path.GetFileName(request.PostedFile.FileName);

            //得到扩展名
            var ext = localFileName.Substring(localFileName.LastIndexOf(‘.‘) + 1).ToLower();
            //如果没有设定扩展名,则使用本身的扩展名存储
            if (string.IsNullOrEmpty(request.Ext))
            {
                request.Ext = ext;
            }
            //判断传入的数据
            if (file.Length == 0)
            {
                errMessage = "无数据提交";
                return false;
            }
            //判断文件是否超过限定大小
            if (file.Length > this.MaxFilesize)
            {
                errMessage = "文件大小超过" + this.MaxFilesize + "字节";
                return false;
            }
            //判断扩展名是否属于给定的
            if (request.Format!=null&& request.Format.Length > 0 && !request.Format.Contains(ext))
            {
                errMessage = "上传文件扩展名必需为:" + string.Join(",", request.Format);
                return false;
            }
            //判断宽高是否符合要求
            if (request.Width > 0||request.Height>0)
            {
                if (request.Width>0&&Math.Abs( image.Width-request.Width)>1)
                {
                    errMessage="宽不符合";
                    image.Dispose();
                    return false;
                }
                else if(request.Height>0&&Math.Abs(image.Height-request.Height)>1){
                    errMessage="高不符合";
                    image.Dispose();
                    return false;
                }
            }
            return true;
        }

        /// <summary>
        /// 设置保存路径以及创建文件夹
        /// </summary>
        /// <param name="request"></param>
        private void SetFile(ref UploadRequest request)
        {
            //如果路径没有设定,则按照给定的路径设置,不过给定路径的话,一定得先确保这个路径是正确的,且存在的
            if (string.IsNullOrEmpty(request.SavePath))
            {
                string subfolder = "day_" + DateTime.Now.ToString("yyMMdd");
                string fileFolder = Path.Combine(UploadConfigContext.UploadPath, request.Folder, subfolder);
                //文件全路径
                request.SavePath = Path.Combine(fileFolder,
                    string.Format("{0}{1}.{2}", DateTime.Now.ToString("yyyyMMddhhmmss"),
                    new Random(DateTime.Now.Millisecond).Next(10000), request.Ext)
                );
                if (!Directory.Exists(fileFolder))
                {
                    Directory.CreateDirectory(fileFolder);
                }
            }
        }
    }

    /// <summary>
    /// 上传使用的参数
    /// </summary>
    public class UploadRequest
    {
        /// <summary>
        /// 自行设置时,保存的子文件夹
        /// </summary>
        public string Folder { get; set; }
        /// <summary>
        /// 设置路径的,如果没设置,则代码自行设置
        /// </summary>
        public string SavePath { get; set; }
        /// <summary>
        /// 上传的数据
        /// </summary>
        public HttpPostedFileBase PostedFile { get; set; }
        /// <summary>
        /// 用来自定义控制扩展名的
        /// </summary>
        public string[] Format { get; set; }

        /// <summary>
        /// 控制宽,<=0则表示不管
        /// </summary>
        public int Width { get; set; }
        /// <summary>
        /// 控制高,<=0则表示不管
        /// </summary>
        public int Height { get; set; }

        /// <summary>
        /// 扩展名
        /// </summary>
        public string Ext { get; set; }
    }

图片上传代码

时间: 2024-09-30 18:55:08

图片上传根据stream生成image的相关文章

thinkphp 3.2.2 图片上传gif类型生成缩略图错误

对gif图片处理不怎么了解, thinkphp3.2.2 对gif图片处理有点小bug,不才,解决不了 但是让其正常的生产缩略图,找到对应的driver类,将gif类型判断的代码注释掉,可以正常生成缩略图, 先简单的解决下, 具体的解决,需要自己找类或者写了.目前不想研究,以后再看.

yii2.0下,单图片上传到搜狐云台以及图片上传到本机。

图片服务器接的是搜狐云台.在搜狐云台上有代码包,下载下来,放到yii框架的vendor下. yii2.0导入第三方库,很简单,写个autoload的文件,然后在入口脚本index.php中包含那个autoload文件就好了.具体到这个云台的库,只要包含代码中的autoload文件就好了. 简单介绍下搜狐云台的实现,用户会有一个对应的域名,然后选择建一些bucket,文件的上传下载都是在这个bucket中执行.函数调用在云台提供的文档中介绍的很清楚.这里就不再介绍了.同时我只从php的部分来介绍,

C#上传图片同时生成缩略图,控制图片上传大小。

1 #region 上传图片生成缩略图 2 /// <summary> 3 /// 上传图片 4 /// </summary> 5 /// <param name="sender"></param> 6 /// <param name="e"></param> 7 public void btnUpload_Click(object sender, EventArgs e) 8 { 9 //检查

[原创]超强C#图片上传,加水印,自动生成缩略图源代码

<%@ Page Language=“C#“ AutoEventWireup=“true“ %> <%@ Import Namespace=“System“ %> <%@ Import Namespace=“System.IO“ %> <%@ Import Namespace=“System.Net“ %> <%@ Import NameSpace=“System.Web“ %> <%@ Import NameSpace=“Legalsof

spring mvc 图片上传,图片压缩、跨域解决、 按天生成目录 ,删除,限制为图片代码等相关配置

spring mvc 图片上传,跨域解决 按天生成目录 ,删除,限制为图片代码,等相关配置 fs.root=data/ #fs.root=/home/dev/fs/ #fs.root=D:/fs/ #fs.domains=182=http://172.16.100.182:18080,localhost=http://localhost:8080 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE be

spring mvc 图片上传,图片压缩、跨域解决、 按天生成文件夹 ,删除,限制为图片代码等相关配置

spring mvc 图片上传,跨域解决 按天生成文件夹 ,删除,限制为图片代码,等相关配置 fs.root=data/ #fs.root=/home/dev/fs/ #fs.root=D:/fs/ #fs.domains=182=http://172.16.100.182:18080,localhost=http://localhost:8080 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE b

微信JS-SDK接口 + FLASK实现图片上传

最近在做一个项目从全球各地采集图片,考虑采用微信JS-SDK来简化开发.图片会首先上传到微信的服务器,返回一个id,然后根据这个id去微信服务器获取图片.微信提供可选择的压缩图片功能.图片首先上传到微信的服务器,可以保障较好的上传稳定性. 详细内容请参考微信的官方文档:微信JS-SDK说明文档 运行页面如下 HTML 在微信demo的基础上修改,见微信JS-SDK DEMO页面 增加图片的多次选择,多次上传,删除等功能 uploadImage.html <!DOCTYPE html> <

ASP.NET Core 简单实现七牛图片上传(FormData 和 Base64)

七牛图片上传 SDK(.NET 版本):https://developer.qiniu.com/kodo/sdk/1237/csharp UpoladService示例代码: public class UpoladService : IUpoladService {     private readonly static string[] _imageExtensions = new string[] { ".jpg", ".png", ".gif&quo

关于文件上传-图片上传

本次开发采用uploader插件   需要在前台引入 使用该插件的 Uploader.swf文件(用于使用时js指向) 在wingsUploader.js 中对uploader插件进行设置 (function($) { // // 设置属性 var uploader; var ratio = window.devicePixelRatio || 1; //用于缩略图 // var thumbnailWidth = 50 * ratio; //缩略图的宽 // var thumbnailHeigh