This commit is contained in:
@@ -34,88 +34,97 @@ namespace AyaNova.Api.ControllerHelpers
|
||||
|
||||
ApiUploadedFilesResult result = new ApiUploadedFilesResult();
|
||||
FormOptions _defaultFormOptions = new FormOptions();
|
||||
|
||||
// Used to accumulate all the form url encoded key value pairs in the
|
||||
// request.
|
||||
var formAccumulator = new KeyValueAccumulator();
|
||||
|
||||
var boundary = MultipartRequestHelper.GetBoundary(
|
||||
MediaTypeHeaderValue.Parse(httpContext.Request.ContentType),
|
||||
_defaultFormOptions.MultipartBoundaryLengthLimit);
|
||||
var reader = new MultipartReader(boundary, httpContext.Request.Body);
|
||||
|
||||
var section = await reader.ReadNextSectionAsync();
|
||||
|
||||
while (section != null)
|
||||
try
|
||||
{
|
||||
ContentDispositionHeaderValue contentDisposition;
|
||||
var hasContentDispositionHeader = ContentDispositionHeaderValue.TryParse(section.ContentDisposition, out contentDisposition);
|
||||
// Used to accumulate all the form url encoded key value pairs in the
|
||||
// request.
|
||||
var formAccumulator = new KeyValueAccumulator();
|
||||
|
||||
if (hasContentDispositionHeader)
|
||||
var boundary = MultipartRequestHelper.GetBoundary(
|
||||
MediaTypeHeaderValue.Parse(httpContext.Request.ContentType),
|
||||
_defaultFormOptions.MultipartBoundaryLengthLimit);
|
||||
var reader = new MultipartReader(boundary, httpContext.Request.Body);
|
||||
|
||||
var section = await reader.ReadNextSectionAsync();
|
||||
|
||||
while (section != null)
|
||||
{
|
||||
if (MultipartRequestHelper.HasFileContentDisposition(contentDisposition))
|
||||
ContentDispositionHeaderValue contentDisposition;
|
||||
var hasContentDispositionHeader = ContentDispositionHeaderValue.TryParse(section.ContentDisposition, out contentDisposition);
|
||||
|
||||
if (hasContentDispositionHeader)
|
||||
{
|
||||
|
||||
string filePathAndName = string.Empty;
|
||||
var CleanedUploadFileName = contentDisposition.FileName.Value.Replace("\"", "");
|
||||
|
||||
//get temp file path and temp file name
|
||||
filePathAndName = FileUtil.NewRandomAttachmentFilesFolderFileName;
|
||||
|
||||
//save to disk
|
||||
using (var stream = new FileStream(filePathAndName, FileMode.Create))
|
||||
if (MultipartRequestHelper.HasFileContentDisposition(contentDisposition))
|
||||
{
|
||||
await section.Body.CopyToAsync(stream);
|
||||
}
|
||||
result.UploadedFiles.Add(new UploadedFileInfo()
|
||||
{
|
||||
InitialUploadedPathName = filePathAndName,
|
||||
OriginalFileName = CleanedUploadFileName,
|
||||
MimeType = section.ContentType
|
||||
|
||||
});
|
||||
}
|
||||
else if (MultipartRequestHelper.HasFormDataContentDisposition(contentDisposition))
|
||||
{
|
||||
// Content-Disposition: form-data; name="key"
|
||||
//
|
||||
// value
|
||||
string filePathAndName = string.Empty;
|
||||
var CleanedUploadFileName = contentDisposition.FileName.Value.Replace("\"", "");
|
||||
|
||||
// Do not limit the key name length here because the
|
||||
// multipart headers length limit is already in effect.
|
||||
var key = HeaderUtilities.RemoveQuotes(contentDisposition.Name);
|
||||
var encoding = GetEncoding(section);
|
||||
using (var streamReader = new StreamReader(
|
||||
section.Body,
|
||||
encoding,
|
||||
detectEncodingFromByteOrderMarks: true,
|
||||
bufferSize: 1024,
|
||||
leaveOpen: true))
|
||||
{
|
||||
// The value length limit is enforced by MultipartBodyLengthLimit
|
||||
var value = await streamReader.ReadToEndAsync();
|
||||
if (String.Equals(value, "undefined", StringComparison.OrdinalIgnoreCase))
|
||||
//get temp file path and temp file name
|
||||
filePathAndName = FileUtil.NewRandomAttachmentFilesFolderFileName;
|
||||
|
||||
//save to disk
|
||||
using (var stream = new FileStream(filePathAndName, FileMode.Create))
|
||||
{
|
||||
value = String.Empty;
|
||||
await section.Body.CopyToAsync(stream);
|
||||
}
|
||||
formAccumulator.Append(key.Value, value);
|
||||
|
||||
if (formAccumulator.ValueCount > _defaultFormOptions.ValueCountLimit)
|
||||
result.UploadedFiles.Add(new UploadedFileInfo()
|
||||
{
|
||||
throw new InvalidDataException($"Form key count limit {_defaultFormOptions.ValueCountLimit} exceeded.");
|
||||
InitialUploadedPathName = filePathAndName,
|
||||
OriginalFileName = CleanedUploadFileName,
|
||||
MimeType = section.ContentType
|
||||
|
||||
});
|
||||
}
|
||||
else if (MultipartRequestHelper.HasFormDataContentDisposition(contentDisposition))
|
||||
{
|
||||
// Content-Disposition: form-data; name="key"
|
||||
//
|
||||
// value
|
||||
|
||||
// Do not limit the key name length here because the
|
||||
// multipart headers length limit is already in effect.
|
||||
var key = HeaderUtilities.RemoveQuotes(contentDisposition.Name);
|
||||
var encoding = GetEncoding(section);
|
||||
using (var streamReader = new StreamReader(
|
||||
section.Body,
|
||||
encoding,
|
||||
detectEncodingFromByteOrderMarks: true,
|
||||
bufferSize: 1024,
|
||||
leaveOpen: true))
|
||||
{
|
||||
// The value length limit is enforced by MultipartBodyLengthLimit
|
||||
var value = await streamReader.ReadToEndAsync();
|
||||
if (String.Equals(value, "undefined", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
value = String.Empty;
|
||||
}
|
||||
formAccumulator.Append(key.Value, value);
|
||||
|
||||
if (formAccumulator.ValueCount > _defaultFormOptions.ValueCountLimit)
|
||||
{
|
||||
throw new InvalidDataException($"Form key count limit {_defaultFormOptions.ValueCountLimit} exceeded.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Drains any remaining section body that has not been consumed and
|
||||
// reads the headers for the next section.
|
||||
section = await reader.ReadNextSectionAsync();
|
||||
}
|
||||
|
||||
// Drains any remaining section body that has not been consumed and
|
||||
// reads the headers for the next section.
|
||||
section = await reader.ReadNextSectionAsync();
|
||||
//Get any extra form fields and return them
|
||||
result.FormFieldData = formAccumulator.GetResults();
|
||||
return result;
|
||||
}
|
||||
catch (Microsoft.AspNetCore.Http.BadHttpRequestException ex)
|
||||
{
|
||||
//most commonly here due to file too large
|
||||
result.Error = $"Code:{ex.StatusCode}, Error: {ex.Message}";
|
||||
return result;
|
||||
|
||||
//Get any extra form fields and return them
|
||||
result.FormFieldData = formAccumulator.GetResults();
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -151,11 +160,13 @@ namespace AyaNova.Api.ControllerHelpers
|
||||
{
|
||||
public Dictionary<string, Microsoft.Extensions.Primitives.StringValues> FormFieldData { get; set; }
|
||||
public List<UploadedFileInfo> UploadedFiles { get; set; }
|
||||
public string Error { get; set; }
|
||||
|
||||
public ApiUploadedFilesResult()
|
||||
{
|
||||
FormFieldData = new Dictionary<string, Microsoft.Extensions.Primitives.StringValues>();
|
||||
UploadedFiles = new List<UploadedFileInfo>();
|
||||
Error = null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user