Webapi formdata upload (to DB) with extra parameters

后端 未结 4 1722
谎友^
谎友^ 2020-11-28 04:47

I need to upload file sending extra paramaters.

I have found the following post in stackoverflow: Webapi ajax formdata upload with extra parameters

It descri

4条回答
  •  萌比男神i
    2020-11-28 05:24

    I really needed the media type and length of the files uploaded so I modified @Mark Seefeldt answer slightly to the following:

    public class MultipartFormFile
    {
        public string Name { get; set; }
        public long? Length { get; set; }
        public string MediaType { get; set; }
        public Stream Stream { get; set; }
    }
    
    public class MultipartFormDataMemoryStreamProvider : MultipartMemoryStreamProvider
    {
        private readonly Collection _isFormData = new Collection();
        private readonly NameValueCollection _formData = new NameValueCollection(StringComparer.OrdinalIgnoreCase);
        private readonly List _fileStreams = new List();
    
        public NameValueCollection FormData
        {
            get { return _formData; }
        }
    
        public List FileStreams
        {
            get { return _fileStreams; }
        }
    
        public override Stream GetStream(HttpContent parent, HttpContentHeaders headers)
        {
            if (parent == null)
            {
                throw new ArgumentNullException("parent");
            }
    
            if (headers == null)
            {
                throw new ArgumentNullException("headers");
            }
    
            var contentDisposition = headers.ContentDisposition;
            if (contentDisposition == null)
            {
                throw new InvalidOperationException("Did not find required 'Content-Disposition' header field in MIME multipart body part.");
            }
    
            _isFormData.Add(String.IsNullOrEmpty(contentDisposition.FileName));
            return base.GetStream(parent, headers);
        }
    
        public override async Task ExecutePostProcessingAsync()
        {
            for (var index = 0; index < Contents.Count; index++)
            {
                HttpContent formContent = Contents[index];
                if (_isFormData[index])
                {
                    // Field
                    string formFieldName = UnquoteToken(formContent.Headers.ContentDisposition.Name) ?? string.Empty;
                    string formFieldValue = await formContent.ReadAsStringAsync();
                    FormData.Add(formFieldName, formFieldValue);
                }
                else
                {
                    // File
                    var file = new MultipartFormFile
                    {
                        Name = UnquoteToken(formContent.Headers.ContentDisposition.FileName),
                        Length = formContent.Headers.ContentLength,
                        MediaType = formContent.Headers.ContentType.MediaType,
                        Stream = await formContent.ReadAsStreamAsync()
                    };
    
                    FileStreams.Add(file);
                }
            }
        }
    
        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;
        }
    }
    

提交回复
热议问题