.net 之 MVC和webAPI 的图片上传(附文件上传工具类)

分别为MVC和webapi版本的图片上传接口



   //图片和表单一起提交的方式(MVC)
   public ActionResult FileUpload()
   {
        var callback = new ApiResultMsg() { Msg = "上传失败!", Code = -1 };
        if (HttpContext.Request.Files.Count > 0)//过滤表单是否有上传文件
        {
            HttpPostedFileBase file = HttpContext.Request.Files["FileName"];//获取前端文件上传控件Name名
       
            string filePath = string.Empty; //上传成功后返回的新文件存放路径
       
            if (file.ContentLength != 0) //二次过滤,过滤是否选择有效上传文件
            {
           
                string extension = Path.GetExtension(file.FileName).ToLower(); //获取上传文件后缀名并转换为小写字母
            
                if (".jpg.gif.png.jpeg".Contains(extensi//下面可对文件类型进行限制等等...等...
                {
                                    
                   filePath = Misc.UploadFile(file,"/Images/",".jpg.gif.png.jpeg");
                }
                else
                {
                   filePath = Misc.UploadFile(file,"/Resource/",".doc.docx.xls.xlsx.txt.pdf.ppt.rar.mp3.mp4.zip.avi");
                }
            }
        
            //下面是也是一种文件保存的方式,假设客户端有多个file提交
            HttpPostedFileBase headPic = HttpContext.Request.Files["HeadPic"];//获取intput file的name的文件
            if (headPic.ContentLength > 0) //二次过滤
            {
                 Stream uploadStream = headPic.InputStream;//这里可以看到文件流
                 String fileName = headPic.FileName;//获取上传文件名
                 String fileExt = Path.GetExtension(fileName).ToLower();//获取上传文件名后缀
                 String DirCurr = @"/Images/UserHeadPic/";//文件存放目录
                   if (!Directory.Exists(HttpContext.Server.MapPath(DirCurr)))//判断当前环境是否存在该路径
                   {
                        Directory.CreateDirectory(HttpContext.Server.MapPath(DirCurr));//创建新文件路径
                   }
                    String saveUrl = HttpContext.Server.MapPath(DirCurr);//映射绝对路径
                    String ymd = DateTime.Now.ToString("yyyyMMdd", DateTimeFormatInfo.InvariantInfo);
                    DirCurr += ymd + "/";
                    saveUrl += ymd + "/";
                    if (!Directory.Exists(saveUrl))
                    {
                        Directory.CreateDirectory(saveUrl);
                    }
                    String newFileName = Misc.MaxCharacters(System.Guid.NewGuid().ToString(), 5) + "-" + Misc.MaxCharacters(Misc.ClearFilename(fileName.Replace(fileExt, "")), 20) + fileExt;
                    String ImgfilePath = saveUrl + newFileName;
                    DirCurr += newFileName;
                    headPic.SaveAs(ImgfilePath);
            }
        }
    }    

    /// <summary>
    ///  普通图片上传 生成一张图片(webApi)
    /// </summary>
    /// <returns>返回带域名得绝对路径</returns>
    [HttpPost]
    [AllowAnonymous]
    public IHttpActionResult UploadImg_SaveFile(string FoldName = "Product")
    {
         string showData = Misc.ConvertToShortDateTime(System.DateTime.Now, "yyyy-MM-dd");
         ApiResultMsg apiResult = new ApiResultMsg { Code = 0 };
         HttpPostedFile file = HttpContext.Current.Request.Files[0];
         if (file == null)
         {
             apiResult.Code = -1;
             apiResult.Msg = "未获取到图片";
             return Json(apiResult);
         }
         string fileName = file.FileName.ToLower();
         string extension = System.IO.Path.GetExtension(fileName).ToLower();
         if (!".jpg.jpeg.png.gif.bmp".Contains(extension))
         {
             apiResult.Code = -1;
             apiResult.Msg = "只能上传图片格式为(.jpg.jpeg.png.gif.bmp)";
             return Json(apiResult);
         }
         int maxFileLength = Convert.ToInt32(1024 * 0.5);
         if (file.ContentLength / 1024 > maxFileLength)
         {
             apiResult.Code = -1;
             apiResult.Msg = "上传图片不能超过" + maxFileLength + "KB";
             return Json(apiResult);
         }
         string foldName = Misc.GetRequstValue("FoldName");//这里获取的参数是否有定义存储路径
         if (string.IsNullOrWhiteSpace(foldName))
         {
             foldName = FoldName;
         }
         string savePath = "/Resource/" + foldName + "/" + showData + "/";
         string newfilename = Misc.GetRandom(10) + extension;
         string fileFullPath = savePath + newfilename;
         string biaozhunImgPath = HttpContext.Current.Server.MapPath(savePath);
         if (!Directory.Exists(biaozhunImgPath))
         {
             Directory.CreateDirectory(biaozhunImgPath);
         }
         file.SaveAs(biaozhunImgPath + newfilename);
         apiResult.Data = new
         {
             newName = fileFullPath,
             oldName = fileName,
             ImgUrl = Misc.GetDevOnlinePath() + fileFullPath //图片路径直接供前端展示
         };
         return Json(apiResult);
    }

public class ApiResultMsg
{
    /// <summary>
    /// 0:表示成功 -1:错误 
    /// </summary>
    [JsonProperty("code")]
    public int Code { get; set; }
    /// <summary>
    /// 返回信息 返回信息
    /// </summary>
    [JsonProperty("msg")]
    public string Msg { get; set; }
    /// <summary>
    /// 返回数据
    /// </summary>
    [JsonProperty("data")]
    public object Data { get; set; }
    /// <summary>
    /// 返回页面
    /// </summary>
    [JsonProperty("back_url")]
    public string BackURL { get; set; }
}

文件上传帮助类:


using System.Data;
using System.Web;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.IO;
using System.Text.RegularExpressions;
using System.Net;
using System.Xml.Serialization;
using System.Xml;
using System.Text;
using System.Collections.Generic;

namespace JDK.CommonSys.Common
{
    public partial class Misc
    {

        public static string ConvertToShortDateTime(object date, string format)
        {
            string newValue = "";

            try
            {
                if (date != null)
                    newValue = Convert.ToDateTime(date).ToString(format);
            }
            catch
            {
            }

            return newValue;
        }

        public static void WriteToFile(string strPath, ref byte[] Buffer)
        {
            // Create a file
            FileStream newFile = new FileStream(strPath, FileMode.Create);

            // Write data to the file
            newFile.Write(Buffer, 0, Buffer.Length);

            // Close file
            newFile.Close();
        }

        public static string NewGUID()
        {
            string newGUID;

            newGUID = Guid.NewGuid().ToString();

            return newGUID;
        }

        /// <summary>
        /// 获取Form或者Query值
        /// </summary>
        /// <param name="param"></param>
        /// <returns></returns>
        public static string GetRequstValue(string param)
        {
            string value = string.Empty;

            try
            {
                value = HttpContext.Current.Request[param].ToString();
            }
            catch
            {
            }

            return value;
        }

        public static string ClearFilename(object filename)
        {
            string file = "";
            if (filename != null)
            {
                file = Convert.ToString(filename);

                file = file.Replace("&", "");
                file = file.Replace("|", "");
                file = file.Replace("'", "");
                file = file.Replace("\"", "");
                file = file.Replace("%", "");
                file = file.Replace("?", "");
                file = file.Replace("@", "");
                file = file.Replace("/", "");
                file = file.Replace(":", "");
                file = file.Replace(".", "");
                file = file.Replace("-", "");
                file = file.Replace("*", "");
                file = file.Replace("\\", "");
                file = file.Replace(" ", "_");
                file = file.Replace("#", "");
            }

            return file;
        }
        
        public static string MaxCharacters(string text, int characters)
        {
            string value = text;

            if (value.Length > characters)
                value = value.Substring(0, characters);

            return value;
        }

        /// <summary>
        /// Upload file
        /// </summary>
        /// <param name="fileUploadControl">Upload Control</param>
        /// <param name="uploadPath">Relative path to save file to, with trailing /</param>
        /// <param name="allowedExtensions">exensions allowed, lowercase (.jpg .gif)</param>
        /// <returns>Filename is returned, without the path</returns>
        public static string UploadFile(FileUpload fileUploadControl, string uploadPath, string allowedExtensions)
        {

            string ShortData = Misc.ConvertToShortDateTime(System.DateTime.Now, "yyyy-MM-dd");
            string savePath = HttpContext.Current.Server.MapPath(uploadPath + "//" + ShortData + "//");
            string newFileName = "";

            if (fileUploadControl.HasFile)
            {
                string fileName = HttpContext.Current.Server.HtmlEncode(fileUploadControl.FileName);
                string extension = System.IO.Path.GetExtension(fileName);

                if (allowedExtensions.Contains(extension.ToLower()))
                {
                    newFileName = Misc.MaxCharacters(System.Guid.NewGuid().ToString(), 5) + "-" + Misc.MaxCharacters(fileUploadControl.FileName.Replace(extension, ""), 20) + extension;
                    if (!Directory.Exists(savePath))
                    {
                        Directory.CreateDirectory(savePath);
                    }
                    savePath += newFileName;

                    fileUploadControl.SaveAs(savePath);
                }
                else
                {
                    newFileName = "";
                }
            }

            return ShortData + "/" + newFileName;
        }
    
        /// <summary>
        /// Upload file
        /// </summary>
        /// <param name="HttpPostedFileBase">FlieBase</param>
        /// <param name="fileUploadControl">Upload Control</param>
        /// <param name="uploadPath">Relative path to save file to, with trailing /</param>
        /// <param name="allowedExtensions">exensions allowed, lowercase (.jpg .gif)</param>
        /// <returns>Filename is returned, without the path</returns>
        public static string UploadFile(HttpPostedFileBase FlieBase, string uploadPath, string allowedExtensions)
        {


            string ShortData = Misc.ConvertToShortDateTime(System.DateTime.Now, "yyyy-MM-dd");
            string savePath = HttpContext.Current.Server.MapPath(uploadPath + "//" + ShortData + "//");
            string newFileName = "";

            if (FlieBase != null)
            {
                string fileName = HttpContext.Current.Server.HtmlEncode(FlieBase.FileName);
                string extension = System.IO.Path.GetExtension(fileName);

                if (allowedExtensions.Contains(extension.ToLower()))
                {
                    newFileName = Misc.MaxCharacters(System.Guid.NewGuid().ToString(), 5) + "-" + Misc.MaxCharacters(FlieBase.FileName.Replace(extension, ""), 20) + extension;
                    if (!Directory.Exists(savePath))
                    {
                        Directory.CreateDirectory(savePath);
                    }
                    savePath += newFileName;

                    FlieBase.SaveAs(savePath);
                }
                else
                {
                    newFileName = "";
                }
            }

            return ShortData + "/" + newFileName;
        }

        /// <summary>
        /// 获取Length位随机数(不重复)
        /// </summary>
        /// <param name="Length"></param>
        /// <returns></returns>
        public static string GetRandom(int Length)
        {
            var result = new StringBuilder();
            for (var i = 0; i < Length; i++)
            {
                var r = new Random(Guid.NewGuid().GetHashCode());
                result.Append(r.Next(0, 10));
            }
            return result.ToString();
        }

        /// <summary>
        /// 随机排序
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="data"></param>
        /// <param name="r"></param>
        /// <returns></returns>
        public static T[] ShuffleCopy<T>(IEnumerable<T> data, Random r)
        {
            var arr = data.ToArray();
            for (var i = arr.Length - 1; i > 0; --i)
            {
                int randomIndex = r.Next(i + 1);
                T temp = arr[i];
                arr[i] = arr[randomIndex];
                arr[randomIndex] = temp;
            }
            return arr;
        }
        /// <summary>
        /// 获取开发线上前缀URL地址
        /// </summary>
        /// <returns></returns>
        public static string GetDevOnlinePath()
        {
            return HttpContext.Current.Request.Url.Host == "localhost"
                        ? HttpContext.Current.Request.Url.Scheme + "://" + HttpContext.Current.Request.Url.Authority
                        : ConfigHelper.GetConfigString("Member_URL");//KEY
        }
    }
}

注意要点:

客户端如果是form表单的提交方式需要在表单里添加"enctype"属性如下:

<form id="fromGo" method="post" enctype="multipart/form-data">
     <input type="file" name="FileName" onchange="uploadFile(this)" style="width:150px" />
     <input type="file" name="HeadPic" onchange="uploadFile(this)" style="width:150px" />
</from>

<script>
    $(function(){
         $('#fromGo').form('submit', {
             url: "API/UploadImg_SaveFile",
             onSubmit: function () {
                return $(this).form('validate');
             },
             success:function(data){
                 if(data){
                    $.messager.show({
                        title: "success",
                        msg: "操作成功"
                    })    
                 }else{
                    $.messager.alert({
                        title: '错误',
                        msg: result.msg
                    });
                 }
             }
         }
    })

    function uploadFile (self) {
        var file = self.files[0];
        var suffix = file.name.substr(file.name.lastIndexOf(".")).toLowerCase();//获得文件后缀名
        if (suffix == '.jpg' || suffix == '.gif' || suffix == '.png' || suffix == '.jpeg') {
            //图片压缩展示处理
            lrz(file, { quality: 0.5 }).then(function (rst) {
                $("#imgId").attr("src", rst.base64);
            });
        }
    }
</script>

如果是ajax或者axios的方式提交

data参数部分可以使用FormData对象,也要注意记得附带请求类型Content-Type : "multipart/form-data",这样服务端才能通过Request.Files[0] 获取到上传的文件,另外通过FormData的方式也可以实现文件批量上传

import axios from 'axios' //这里引用axios组件,类似与ajax

Vue.prototype.$ajax = axios //挂载到vue全局变量中

export default{
    data:function(){
        return{
            param: null,
        }
    },
    mounted() {},
    created() {},
    methods: {
        handleUpload(file){
            let config = {
                    headers: {
                        "Content-Type": "multipart/form-data"
                    }
            };
            this.param = this.param || new FormData();
            this.param.append("file", file.raw, file.name);
            this.$ajax.post("API/UploadImg_SaveFile",this.param,config).then(res =>{
                
            })
        }
    }
}

猜你喜欢

转载自blog.csdn.net/cslx5zx5/article/details/107081236
今日推荐