• webapi批量上传照片(form-data)


    #region 上传文件接口
            /// <summary>
            /// 上传文件
            /// </summary>
            /// <param name="request"></param>
            /// <returns></returns>
            [HttpPost]
            [Route("postFile")]
            public Task<HttpResponseMessage> PostFile(HttpRequestMessage request)
            {
                // 是否请求包含multipart/form-data。
                if (!request.Content.IsMimeMultipartContent())
                {
                    Logger.Error("上传格式不是multipart/form-data");
                    throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
                }
                if (!ModelState.IsValid)
                {
                    Logger.Error("PostFile参数错误。");
                    throw new HttpResponseException(HttpStatusCode.BadRequest);
                }
    
                var root = AppDomain.CurrentDomain.BaseDirectory;
                var provider = new MultipartFormDataStreamProvider(root);
    
                // 阅读表格数据并返回一个异步任务.
                var task = request.Content.ReadAsMultipartAsync(provider).ContinueWith<HttpResponseMessage>(t =>
                {
                    HttpResponseMessage response = null;
                    if (t.IsFaulted || t.IsCanceled)
                    {
                        Logger.Info("PostFile is faulted or canceled: " + t.Exception.Message);
                        response = request.CreateErrorResponse(HttpStatusCode.InternalServerError, t.Exception);
                    }
                    else
                    {
                        // 
                        string dicName = DateTime.Now.ToString("yyyyMMdd");
                        string ftpPath = CreateFolderAtFtp(modelName, dicName);
    
                        long visitInfoId = 0;
                        if (!long.TryParse(provider.FormData["visitInfoId"], out visitInfoId))
                        {
                            response = request.CreateErrorResponse(HttpStatusCode.InternalServerError, "参数格式错误!");
                        }
                        else
                        {
                            // 多文件上传
                            foreach (var file in provider.FileData)
                            {
                                string fileName = file.Headers.ContentDisposition.FileName;
                                if (fileName.StartsWith(""") && fileName.EndsWith("""))
                                {
                                    fileName = fileName.Trim('"');
                                }
                                if (fileName.Contains(@"/") || fileName.Contains(@""))
                                {
                                    fileName = Path.GetFileName(fileName);
                                }
                                String ext = System.IO.Path.GetExtension(fileName);
                                var newFileName = DateTime.Now.ToString("yyyyMMddhhmmssfff") + ext;
                                File.Copy(file.LocalFileName, Path.Combine(root, newFileName));
                                FileInfo img = new FileInfo(Path.Combine(root, newFileName));
    
                                FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpAddress + ftpPath + "/" + newFileName));
                                reqFTP.Credentials = new NetworkCredential(username, password);
                                reqFTP.KeepAlive = false;
                                reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
                                reqFTP.UseBinary = true;
                                reqFTP.ContentLength = img.Length;
                                int buffLength = 2048;
                                byte[] buff = new byte[buffLength];
                                int contentLen;
                                FileStream fs = img.OpenRead();
                                try
                                {
                                    Stream strm = reqFTP.GetRequestStream();
                                    contentLen = fs.Read(buff, 0, buffLength);
                                    while (contentLen != 0)
                                    {
                                        strm.Write(buff, 0, contentLen);
                                        contentLen = fs.Read(buff, 0, buffLength);
                                    }
                                    strm.Close();
                                    fs.Close();
                                    img.Delete();
                                    File.Delete(file.LocalFileName);
                                }
                                catch (Exception ex)
                                {
                                    Logger.Error("PostFile()服务器错误", ex);
                                    response = request.CreateResponse(HttpStatusCode.InternalServerError, new { error = "文件上次失败,请与管理员联系!" });
                                }
                                var entity = new VisitPiction
                                {
                                    CustomerVisitInfoId = visitInfoId,
                                    Createtime = DateTime.Now,
                                    Path = httpAddress + ftpPath + "/" + newFileName
                                };
                                customerService.AddVisitPic(entity);
                            }
                            response = request.CreateResponse(HttpStatusCode.OK, new { success = true });
                        }
                    }
                    return response;
                });
                return task;
            }
    
            public string CreateFolderAtFtp(string modelName, string dicName)
            {
                string ftpPath = string.Empty;
                if (!string.IsNullOrEmpty(modelName))
                {
                    //检测是否有该企业的模块文件夹
                    bool isExist = IsDirectoryExist(ftpAddress + modelName + "/");
                    if (!isExist)
                    {
                        string dic = CreateDirectoryAtFtp(modelName, "", "");
                        if (string.IsNullOrEmpty(dic))
                        {
                            throw new Exception("创建文件夹失败");
                        }
                    }
                    ftpPath += "/" + modelName;
                }
                if (!string.IsNullOrEmpty(dicName))
                {
    
                    //检测是否有该企业模块下的子文件夹
                    bool isExist = IsDirectoryExist(ftpAddress + modelName + "/" + dicName + "/");
                    if (!isExist)
                    {
                        string dic = CreateDirectoryAtFtp(modelName, dicName, "");
                        if (string.IsNullOrEmpty(dic))
                        {
                            throw new Exception("创建文件夹失败");
                        }
                    }
                    ftpPath += "/" + dicName;
                }
                return ftpPath;
            }
            /// <summary>
            /// 判斷指定得路徑是否存在于ftp上
            /// </summary>
            /// <param name="fileFullPath"></param> 
            public bool IsDirectoryExist(string fullDirectory)
            {
                if (!fullDirectory.EndsWith("/"))
                    fullDirectory += "/";
                bool result = false;
                //執行ftp命令 活動目錄下所有文件列表
                Uri uriDir = new Uri(fullDirectory);
                WebRequest listRequest = WebRequest.Create(uriDir);
                listRequest.Method = WebRequestMethods.Ftp.ListDirectory;
                listRequest.Credentials = new NetworkCredential(username, password);
                //listRequest.KeepAlive = false;  //執行一個命令后關閉連接
                WebResponse listResponse = null;
    
                try
                {
                    listResponse = listRequest.GetResponse();
                    result = true;
                }
                catch
                {
                    result = false;
                }
                finally
                {
                    if (listResponse != null)
                        listResponse.Close();
                }
    
                return result;
            }
    
            /// <summary>
            /// 在FTP創建一個新文件夾
            /// </summary>
            /// <param name="root">要在那个路径下创建文件夹</param>
            /// <param name="DicLayer3"></param>
            /// <returns>创建成功的ftp上的全路径</returns>
            private string CreateDirectoryAtFtp(string DicLayer1, string DicLayer2, string DicLayer3)
            {
    
                try
                {
                    //在ftp上的路径
                    string ftpPath = DicLayer1;
                    if (!string.IsNullOrEmpty(DicLayer2))
                    {
                        ftpPath += "/" + DicLayer2;
                    }
                    if (!string.IsNullOrEmpty(DicLayer3))
                    {
                        ftpPath += "/" + DicLayer3;
                    }
                    Uri uri = new Uri(ftpAddress + ftpPath);
                    FtpWebRequest listRequest = (FtpWebRequest)FtpWebRequest.Create(uri);
                    if (!IsDirectoryExist(uri.ToString()))
                    {
                        listRequest.Method = WebRequestMethods.Ftp.MakeDirectory;
                    }
                    else
                    {
                        CreateFullDirectoryAtFtp(uri.ToString());
                        listRequest.Method = WebRequestMethods.Ftp.ListDirectory;
                    }
                    listRequest.Credentials = new NetworkCredential(username, password);
                    listRequest.KeepAlive = false;                                  //執行一個命令后關閉連接
                    FtpWebResponse listResponse = (FtpWebResponse)listRequest.GetResponse();
    
                    string fullPath = ftpAddress + ftpPath + "/";
                    Stream write = GetWriteStream(fullPath + "ftpPath.ini");  //在ftp上創建文件
                    byte[] context = System.Text.Encoding.Default.GetBytes("ftpPath=" + ftpPath);
                    write.Write(context, 0, context.Length);
                    write.Close();
                    return ftpPath;    // 返回創建目錄路徑
                }
                catch (Exception ex)
                {
                    Logger.Error("创建文件夹失败" + ex.Message);
                    return String.Empty;
                }
            }
    
            /// <summary>
            /// 在ftp上創建文件夾(若目錄不存在則依序創建)。
            /// </summary>
            /// <param name="directoryName"></param>
            public void CreateFullDirectoryAtFtp(string directoryPath)
            {
                Uri uriDir = new Uri(directoryPath);
                directoryPath = uriDir.AbsolutePath;
                directoryPath = directoryPath.Replace(@"", "/");
                directoryPath = directoryPath.Replace("//", "/");
                string[] aryDirctoryName = directoryPath.Split('/');
                string realPath = "";
                realPath = ftpAddress;
                for (int i = 0; i < aryDirctoryName.Length; i++)
                {
                    if (aryDirctoryName[i] != String.Empty)
                    {
                        realPath = realPath + "/" + aryDirctoryName[i];
                        if (!IsDirectoryExist(realPath))
                        {
                            CreateDirectoryAtFtp(realPath);
                        }
    
                    }
                }
            }
            /// <summary>
            /// 在ftp上創建文件夾,用於對zip文檔得解壓。
            /// </summary>
            /// <param name="directoryName"></param>
            public void CreateDirectoryAtFtp(string directoryName)
            {
                try
                {
                    Uri uri = new Uri(directoryName);
                    FtpWebRequest listRequest = (FtpWebRequest)WebRequest.Create(uri);
                    listRequest.Method = WebRequestMethods.Ftp.MakeDirectory;
                    listRequest.Credentials = new NetworkCredential(username, password);
                    listRequest.KeepAlive = false;                                  //執行一個命令后關閉連接
                    FtpWebResponse listResponse = (FtpWebResponse)listRequest.GetResponse();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
    
            public Stream GetWriteStream(string fileFullName)
            {
                FtpWebRequest uploadRequest = (FtpWebRequest)WebRequest.Create(new Uri(fileFullName));
                uploadRequest.Method = WebRequestMethods.Ftp.UploadFile;
                uploadRequest.Credentials = new NetworkCredential(username, password);
                uploadRequest.KeepAlive = false;    //執行一個命令后關閉連接.
                uploadRequest.UseBinary = true;
                return uploadRequest.GetRequestStream();
            }
            /// <summary>
            /// 获取文件路径
            /// </summary>
            /// <param name="strPath"></param>
            /// <returns></returns>
            private string MapPath(string strPath)
            {
                if (HttpContext.Current != null)
                {
                    return HttpContext.Current.Server.MapPath(strPath);
                }
                else //非web程序引用             
                {
                    strPath = strPath.Replace("/", "\");
                    if (strPath.StartsWith("\"))
                    {
                        strPath = strPath.TrimStart('\');
                    }
                    return System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, strPath);
                }
            }
            #endregion
    

      

  • 相关阅读:
    day 30 粘包 自定义报头
    day29 网络基础之网络协议和通信
    day28 面向对象的进阶 反射 和类的内置方法
    day 27 模块和包 面向对象的复习
    CGI,FastCGI,PHP-CGI和PHP-FPM的区别
    跨平台的移动应用开发引擎CrossApp简介
    element-ui组件中的select等的change事件中传递自定义参数
    关于setInterval和setTImeout中的this指向问题
    懒加载和预加载的区别
    vueX的五个核心属性
  • 原文地址:https://www.cnblogs.com/hegx/p/7210477.html
Copyright © 2020-2023  润新知