.net mvc web api上傳圖片/文件並重命名

寫這個上傳圖片也是耗時好久,以前在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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章