Asp.net 开发中的上传图片文件问题

使用场景

Asp.net 中在web开发的时候,总是需要上传很多的图片或者文件,那么问题来了。当用户量达到一定数量的时候,同时有很多的人上传图片或者文件。我们该如何命名呢?如果不解决这个问题,用户上传的时候很有可能会冲突,比如说会命名相同的可能性。还有就是当很多人向服务器中发送图片或者文档的时候,我们该如何保存呢?将所有用户传入的图片都放到一个文件夹吗?如果用户量大的话这样肯定是不行的。

 

1、文件的保存问题(命名)(文件流的MD5当然也是一个解决办法)

对上传文件进行重命名(这里重点介绍Guid方式实现)

String newfileName=Guid.NewGuid().Tostring();

Guid的介绍

1)一个GUID为一个128位的整数(16字节),在使用唯一标识符的情况下,你可以在所有计算机和网络之间使用这一整数。

2)GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。例如:337c7f2b-7a34-4f50-9141-bab9e6478cc8 即为有效的 GUID 值。

3)世界上(Koffer注:应该是地球上)的任何两台计算机都不会生成重复的 GUID 值。GUID 主要用于在拥有多个节点、多台计算机的网络或系统中,分配必须具有唯一性的标识符。

4)在 Windows 平台上,GUID 应用非常广泛:注册表、类及接口标识、数据库、甚至自动生成的机器名、目录名等。

.NET中使用GUID

GUID 在 .NET 中使用非常广泛,而且 .NET Framework 提供了专门 Guid 基础结构。

Guid 结构的常用法包括:

1) Guid.NewGUID()

生成一个新的 GUID 唯一值

扫描二维码关注公众号,回复: 8790877 查看本文章

2) Guid.ToString()

将 GUID 值转换成字符串,便于处理

3)构造函数 Guid(string)

由 string 生成 Guid 结构,其中string 可以为大写,也可以为小写,可以包含两端的定界符“{}”或“()”,甚至可以省略中间的“-”,Guid 结构的构造函数有很多,其它构造用法并不常用。

2、文件的存储问题

将上传文件放到不同的目录下

 string dir = "/ImageUpload/"+DateTime.Now.Year+"/"+DateTime.Now.Month+"/"+DateTime.Now.Day+"/";

public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/html";
           HttpPostedFile file=context.Request.Files[0];//获取上传的文件.
           if (file.ContentLength>0)
           {
               //对上传的文件类型进行校验。
               string fileName =Path.GetFileName(file.FileName);//获取上传文件的名称包含扩展名。
               string fileExt = Path.GetExtension(fileName);//获取用户上传的文件扩展名。
               if (fileExt == ".jpg")
               {
                   //对上传文件进行重命名
                   string newfileName = Guid.NewGuid().ToString();
                   //将上传的文件放在不同的目录下面
                   string dir = "/ImageUpload/"+DateTime.Now.Year+"/"+DateTime.Now.Month+"/"+DateTime.Now.Day+"/";
                   //创建文件夹
                   if (!Directory.Exists(context.Request.MapPath(dir)))
                   {
                       Directory.CreateDirectory(context.Request.MapPath(dir));
                   }

                   string fullDir = dir + newfileName + fileExt;//文件存放的完整路径。
                   file.SaveAs(context.Request.MapPath(fullDir));

                 //  file.SaveAs(context.Request.MapPath("/ImageUpload/"+fileName));//完成文件的保存。
                   context.Response.Write("<html><body><img src='"+fullDir+"'/></body></html>");
               }
               else
               {
                   context.Response.Write("只能上传图片文件");
               }
           }
           else
           {
               context.Response.Write("请选择上传文件");
           }
        }




#region 上传图片
        /// <summary>
        /// 上传图片到服务器  当error为0时成功,为1时失败 并从errmsg获取消息
        /// </summary>
        /// <returns></returns>
        public Task<Hashtable> post()
        {
            String PhoneId = null;

            // 检查是否是 multipart/form-data 
            if (!Request.Content.IsMimeMultipartContent("form-data"))
                throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
            //文件保存目录路径 
            System.String dirTempPath = @"C:\picture";
            // 设置上传目录 
            var provider = new MultipartFormDataStreamProvider(dirTempPath);
            //var queryp = Request.GetQueryNameValuePairs();//获得查询字符串的键值集合 

            //接受数据并保存文件
            var task = Request.Content.ReadAsMultipartAsync(provider).
                ContinueWith<System.Collections.Hashtable>(o =>
                {
                    Hashtable hash = new Hashtable();


                    hash["error"] = 1;
                    hash["errmsg"] = "上传出错";
                    var file = provider.FileData[0];//provider.FormData 

                    string orfilename = file.Headers.ContentDisposition.FileName.TrimStart('"').TrimEnd('"');
                    FileInfo fileinfo = new FileInfo(file.LocalFileName);
                    //判断拿到的PhoneId
                    PhoneId = provider.FormData["PhoneId"];

                    if (string.IsNullOrEmpty(PhoneId.Trim()) || PhoneId.Trim().Length == 0)
                    {
                        hash["error"] = 1;
                        hash["errmsg"] = "未上传PhoneId";
                        fileinfo.Delete();      //如果不写这句你会发现  返回的数据是正常的 但文件依旧会Down下来
                        return hash;
                    }
                    //最大文件大小 
                    int maxSize = 10000000;
                    if (fileinfo.Length <= 0)
                    {
                        hash["error"] = 1;
                        hash["errmsg"] = "请选择上传文件。";
                        fileinfo.Delete();
                        return hash;
                    }
                    else if (fileinfo.Length > maxSize)
                    {
                        hash["error"] = 1;
                        hash["errmsg"] = "上传文件大小超过限制。";
                        fileinfo.Delete();
                        return hash;
                    }
                    else
                    {
                        string fileExt = orfilename.Substring(orfilename.LastIndexOf('.'));
                        //定义允许上传的文件扩展名 
                        String fileTypes = "gif,jpg,jpeg,png,bmp";
                        if (String.IsNullOrEmpty(fileExt) || Array.IndexOf(fileTypes.Split(','), fileExt.Substring(1).ToLower()) == -1)
                        {
                            hash["error"] = 1;
                            hash["errmsg"] = "上传文件扩展名是不允许的扩展名。";
                            fileinfo.Delete();
                            return hash;
                        }
                        else
                        {
                            string path = @"picture\" + PhoneId + ".jpg";
                            try
                            {
                                if (modelusers.updatePicture(PhoneId, path) != 1)
                                {
                                    hash["error"] = 1;
                                    hash["errmsg"] = "更新数据库失败";
                                    fileinfo.Delete();
                                    return hash;
                                }


                            }
                            catch (Exception ex)
                            {
                                hash["error"] = 1;
                                hash["errmsg"] = "更新数据库失败2";
                                fileinfo.Delete();
                                return hash;

                            }
                            String ymd = DateTime.Now.ToString("yyyyMMdd", System.Globalization.DateTimeFormatInfo.InvariantInfo);
                            //String newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff", System.Globalization.DateTimeFormatInfo.InvariantInfo);
                            String newFileName = PhoneId;
                            fileinfo.CopyTo(Path.Combine(dirTempPath, newFileName + fileExt), true);
                            fileinfo.Delete();


                            hash["error"] = 0;
                            hash["errmsg"] = "上传成功";
                        }
                    }
                    return hash;
                });

            return task;
        } 
        #endregion
发布了133 篇原创文章 · 获赞 70 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/whc888666/article/details/101163490