Thứ Ba, 22 tháng 12, 2020

Web api upload C#

 + Tạo class: InMemoryMultipartFormDataStreamProvider

using System;

using System.Collections.Generic;

using System.Collections.ObjectModel;

using System.Collections.Specialized;

using System.IO;

using System.Linq;

using System.Net.Http;

using System.Net.Http.Headers;

using System.Threading.Tasks;

using System.Web;


// Nếu thiếu System.Net.Http thì vào C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5

// copy vào thư mục bin của project


namespace WebAPIUpload.App_Code

{

    public class InMemoryMultipartFormDataStreamProvider : MultipartStreamProvider

    {

        private NameValueCollection _formData = new NameValueCollection();

        private List<HttpContent> _fileContents = new List<HttpContent>();


        // Set of indexes of which HttpContents we designate as form data  

        private Collection<bool> _isFormData = new Collection<bool>();


        /// <summary>  

        /// Gets a <see cref="NameValueCollection"/> of form data passed as part of the multipart form data.  

        /// </summary>  

        public NameValueCollection FormData

        {

            get { return _formData; }

        }


        /// <summary>  

        /// Gets list of <see cref="HttpContent"/>s which contain uploaded files as in-memory representation.  

        /// </summary>  

        public List<HttpContent> Files

        {

            get { return _fileContents; }

        }


        public override Stream GetStream(HttpContent parent, HttpContentHeaders headers)

        {

            // For form data, Content-Disposition header is a requirement  

            ContentDispositionHeaderValue contentDisposition = headers.ContentDisposition;

            if (contentDisposition != null)

            {

                // We will post process this as form data  

                _isFormData.Add(String.IsNullOrEmpty(contentDisposition.FileName));


                return new MemoryStream();

            }


            // If no Content-Disposition header was present.  

            throw new InvalidOperationException(string.Format("Did not find required '{0}' header field in MIME multipart body part..", "Content-Disposition"));

        }


        /// <summary>  

        /// Read the non-file contents as form data.  

        /// </summary>  

        /// <returns></returns>  

        public override async Task ExecutePostProcessingAsync()

        {

            // Find instances of non-file HttpContents and read them asynchronously  

            // to get the string content and then add that as form data  

            for (int index = 0; index < Contents.Count; index++)

            {

                if (_isFormData[index])

                {

                    HttpContent formContent = Contents[index];

                    // Extract name from Content-Disposition header. We know from earlier that the header is present.  

                    ContentDispositionHeaderValue contentDisposition = formContent.Headers.ContentDisposition;

                    string formFieldName = UnquoteToken(contentDisposition.Name) ?? String.Empty;


                    // Read the contents as string data and add to form data  

                    string formFieldValue = await formContent.ReadAsStringAsync();

                    FormData.Add(formFieldName, formFieldValue);

                }

                else

                {

                    _fileContents.Add(Contents[index]);

                }

            }

        }


        /// <summary>  

        /// Remove bounding quotes on a token if present  

        /// </summary>  

        /// <param name="token">Token to unquote.</param>  

        /// <returns>Unquoted token.</returns>  

        private static string UnquoteToken(string token)

        {

            if (String.IsNullOrWhiteSpace(token))

            {

                return token;

            }


            if (token.StartsWith("\"", StringComparison.Ordinal) && token.EndsWith("\"", StringComparison.Ordinal) && token.Length > 1)

            {

                return token.Substring(1, token.Length - 2);

            }


            return token;

        }

    }

}

+ API Upload:

/// <summary>  

        /// Upload Document.....  

        /// </summary>        

        /// <returns></returns>  

        [HttpPost]

        [Route("MediaUpload")]

        public async Task<HttpResponseMessage> MediaUpload()

        {

            // Check if the request contains multipart/form-data.  

            //if (!Request.Content.IsMimeMultipartContent())

            //{

            //    throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);

            //}


            var x = Request.Content.Headers.ContentLength; // kích thước Body: = 0 body rỗng 


            var provider = await Request.Content.ReadAsMultipartAsync<InMemoryMultipartFormDataStreamProvider>(new InMemoryMultipartFormDataStreamProvider());


            //access form data  

            NameValueCollection formData = provider.FormData;


            //Get body headers info: json key

            string json = "";

            if (formData["json"] != null)

            {

                json = formData["json"];

            }


            //access files  

            IList<HttpContent> files = provider.Files;

            int dem = 0;


            foreach (HttpContent fileContent in files)

            {

                // body key

                string key = fileContent.Headers.ContentDisposition.Name.Trim('\"');


                string thisFileName = fileContent.Headers.ContentDisposition.FileName.Trim('\"');


                // stream

                Stream input = await fileContent.ReadAsStreamAsync();


                //folder path

                DateTime dt = DateTime.Now;

                string sPath = Static.GetPath() + "/PhanAnh/" + DateTime.Now.ToString("yyyy/MM") + "/";

                sPath = HttpContext.Current.Server.MapPath(sPath);


                //create folder if not Exists

                if (!Directory.Exists(sPath))

                    Directory.CreateDirectory(sPath);


                //file path

                string fileName = DateTime.Now.ToString("yyyyMMddHHmmssfff");

                var fileExtension = Path.GetExtension(thisFileName);

                var filePath = System.IO.Path.Combine(sPath, fileName + fileExtension);


                using (Stream file = File.OpenWrite(filePath))

                {

                    input.CopyTo(file);

                    file.Close();

                }


                dem++;

            }


            var response = Request.CreateResponse(HttpStatusCode.OK);

            //response.Headers.Add("DocsUrl", URL);

            //response.Content = new StringContent("Upload thành công file: " + thisFileName + ". Lưuvào thư mục ClientDocument", Encoding.UTF8);

            if (dem > 0)

                response.Content = new StringContent("Upload thành công " + dem + " file  - Chuoi json = " + json);

            return response;

        }

Không có nhận xét nào:

Đăng nhận xét