.net mvc web api上传图片/文件并重命名

原创 2016年05月30日 20:36:23

写这个上传图片也是耗时好久,以前在asp.net的时候因为自己写前台加后台。后台也很简单的就能拿到数据,不做多少判断。直到现在写项目,才感觉当初多差,在此告诫下大家写代码时该做的判断,自己尽可能去完善逻辑与错误判断。
这个项目是拿.net mvc web api写的后台,android写的客户端。
上传文件的大体思路在从http传输的数据域中拿到2进制数据,并保存下来
废话不多说,代码附上:

#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);
            //文件保存目录路径 
            //string SaveTempPath = "~/App_Data/";
            //System.String dirTempPath = HttpContext.Current.Server.MapPath(SaveTempPath);
            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

值得注意的几点:
- 当上传成功时,error值为0。失败时,error为1并从errmsg中获取失败消息。
- 在文件路径处偷了个懒直接把文件的路径塞上去了,如果是从当前路径下放文件的话,请遵循注释。
- PhoneId = provider.FormData[“PhoneId”];这句拿到你应该上传的文件名,根据你的需求修改
- 如果不进行重新命名的话,文件会有默认命名值,并且没有后缀名。这是因为MVC4.0 WebAPI上传后的图片默认以字符串bodypart结合Guid来命名,且没有文件后缀
- fileinfo.Delete();如果不写这句你会发现 返回的数据是失败的 但文件依旧会Down下来 这是因为文件在一开始执行的时候就已经保存下来了,所以在失败后你应该将他删除。


接下来是我自己写的简单测试代码,各位再写完接口时要自己多测试测试,塞一些异常数据进去,看看是否能够正常运行,不要等到后期出问题了再反过头去修改。

<html>

    <form action="这里写接口url" method="post"  enctype="multipart/form-data">

        <input type="file" name="file">

        <hr>
        <input type="text" name="PhoneId" id="PhoneId">
        <hr>
        <input type="submit" value="submit" id="btnPutUserInfo">


     </form> 
</html>
版权声明:本文为博主原创文章,未经博主允许不得转载。

MVC WebApi 图片上传和显示

1 MVC中显示 内存流 中的图片。(不是图片文件) 创建一个Index用来显示 Action: public ActionResult Index() { r...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

关于MVC4.0 WebAPI上传图片重命名以及图文结合

MVC4.0 WebAPI上传后的图片默认以字符串bodypart结合Guid来命名,且没有文件后缀,为解决上传图片重命名以及图文结合发布的问题,在实体对象的处理上,可将图片属性定义为byte[]对象...

ASP.NET WebApi 文件上传功能

今天同事在使用ASP.NET WebApi开发一个文件上传功能时发现WebApi无法实现大文件上传功能,于是向我求助。     当我知道这个问题的时候第一反应是WebApi不可能不支持,于...

webapi上传图片的两种方式

///         /// App上传图片         ///         /// 返回上传图片的相对路径         [HttpPost]         public...

asp.net上传文件重命名的方法及IO修改文件名

文件上传时为了避免覆盖掉文件名相同的文件,一般都是采用系统时间当文件名,精确到毫秒,这样可以防止上传文件冲突  Java代码   string name = this.File...

C# WebApi 上传文件

public class FileUploadController : ApiController 2 { 3 4 public async Task Post() ...
  • zjlovety
  • zjlovety
  • 2015年04月17日 14:55
  • 13172

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Mybatis传多个参数(三种解决方案)

(转载)Mybatis传多个参数(三种解决方案)

HTTP返回码中301与302的区别

一.官方说法 301,302 都是HTTP状态的编码,都代表着某个URL发生了转移,不同之处在于:  301 redirect: 301 代表永久性转移(Permanently Moved)。 ...
  • qmhball
  • qmhball
  • 2012年08月07日 14:28
  • 71733
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:.net mvc web api上传图片/文件并重命名
举报原因:
原因补充:

(最多只允许输入30个字)