public async Task FormFileModelBinder_ReturnsNoResult_WithEmptyContentDisposition() { // Arrange var formFiles = new FormFileCollection(); formFiles.Add(new Mock<IFormFile>().Object); var httpContext = GetMockHttpContext(GetMockFormCollection(formFiles)); var bindingContext = GetBindingContext(typeof(IFormFile), httpContext); var binder = new FormFileModelBinder(); // Act var result = await binder.BindModelAsync(bindingContext); // Assert Assert.NotEqual(ModelBindingResult.NoResult, result); Assert.Null(result.Model); }
public void Validate_should_be_valid_if_less_than_or_equal_to_max_size(long fileSizeBytes) { const string questionId = "QId"; var config = new CustomValidationConfiguration { Name = "FileSizeMaxMb", QuestionId = questionId, Value = "1", ErrorMessage = "The file is larger than 1 Mb" }; var files = new FormFileCollection(); files.Add(CreateFile("This file should be ignored", 5000000)); files.Add(CreateFile("QId", fileSizeBytes)); var validator = new FileSizeMaxMbValidator(config, files); var result = validator.Validate(); result.IsValid.Should().BeTrue(); result.QuestionId.Should().Be(questionId); result.ErrorMessage.Should().BeNull(); }
public void Validate_should_be_invalid_if_more_than_max_size() { const string questionId = "QId"; const string errorMessage = "The file is larger than 1 Mb"; var config = new CustomValidationConfiguration { Name = "FileSizeMaxMb", QuestionId = "QId", Value = "1", ErrorMessage = errorMessage }; var files = new FormFileCollection(); files.Add(CreateFile("This file should be ignored", 5000000)); files.Add(CreateFile("QId", 1024 * 1024 + 1)); var validator = new FileSizeMaxMbValidator(config, files); var result = validator.Validate(); result.IsValid.Should().BeFalse(); result.QuestionId.Should().Be(questionId); result.ErrorMessage.Should().Be(errorMessage); }
public async Task FormFileModelBinder_UsesFieldNameForTopLevelObject(bool isTopLevel, string expected) { // Arrange var formFiles = new FormFileCollection(); formFiles.Add(GetMockFormFile("FieldName", "file1.txt")); formFiles.Add(GetMockFormFile("ModelName", "file1.txt")); var httpContext = GetMockHttpContext(GetMockFormCollection(formFiles)); var bindingContext = GetBindingContext(typeof(IFormFile), httpContext); bindingContext.IsTopLevelObject = isTopLevel; bindingContext.FieldName = "FieldName"; bindingContext.ModelName = "ModelName"; var binder = new FormFileModelBinder(); // Act await binder.BindModelAsync(bindingContext); // Assert Assert.True(bindingContext.Result.IsModelSet); var file = Assert.IsAssignableFrom <IFormFile>(bindingContext.Result.Model); Assert.Equal(expected, file.Name); }
public async Task FormFileModelBinder_ExpectMultipleFiles_BindSuccessful() { // Arrange var formFiles = new FormFileCollection(); formFiles.Add(GetMockFormFile("file", "file1.txt")); formFiles.Add(GetMockFormFile("file", "file2.txt")); var httpContext = GetMockHttpContext(GetMockFormCollection(formFiles)); var bindingContext = GetBindingContext(typeof(IEnumerable<IFormFile>), httpContext); var binder = new FormFileModelBinder(); // Act var result = await binder.BindModelAsync(bindingContext); // Assert Assert.NotEqual(ModelBindingResult.NoResult, result); Assert.True(result.IsModelSet); var entry = bindingContext.ValidationState[result.Model]; Assert.True(entry.SuppressValidation); Assert.Null(entry.Key); Assert.Null(entry.Metadata); var files = Assert.IsAssignableFrom<IList<IFormFile>>(result.Model); Assert.Equal(2, files.Count); }
public async Task FormFileModelBinder_UsesFieldNameForTopLevelObject(bool isTopLevel, string expected) { // Arrange var formFiles = new FormFileCollection(); formFiles.Add(GetMockFormFile("FieldName", "file1.txt")); formFiles.Add(GetMockFormFile("ModelName", "file1.txt")); var httpContext = GetMockHttpContext(GetMockFormCollection(formFiles)); var bindingContext = GetBindingContext(typeof(IFormFile), httpContext); bindingContext.IsTopLevelObject = isTopLevel; bindingContext.FieldName = "FieldName"; bindingContext.ModelName = "ModelName"; var binder = new FormFileModelBinder(); // Act var result = await binder.BindModelAsync(bindingContext); // Assert Assert.NotEqual(ModelBindingResult.NoResult, result); Assert.True(result.IsModelSet); var file = Assert.IsAssignableFrom <IFormFile>(result.Model); ContentDispositionHeaderValue contentDisposition; ContentDispositionHeaderValue.TryParse(file.ContentDisposition, out contentDisposition); Assert.Equal(expected, contentDisposition.Name); }
public async Task FormFileModelBinder_ExpectMultipleFiles_BindSuccessful() { // Arrange var formFiles = new FormFileCollection(); formFiles.Add(GetMockFormFile("file", "file1.txt")); formFiles.Add(GetMockFormFile("file", "file2.txt")); var httpContext = GetMockHttpContext(GetMockFormCollection(formFiles)); var bindingContext = GetBindingContext(typeof(IEnumerable <IFormFile>), httpContext); var binder = new FormFileModelBinder(); // Act var result = await binder.BindModelAsync(bindingContext); // Assert Assert.NotEqual(ModelBindingResult.NoResult, result); Assert.True(result.IsModelSet); var entry = bindingContext.ValidationState[result.Model]; Assert.True(entry.SuppressValidation); Assert.Null(entry.Key); Assert.Null(entry.Metadata); var files = Assert.IsAssignableFrom <IList <IFormFile> >(result.Model); Assert.Equal(2, files.Count); }
private void AddFile(string content, string contentDisposition, string contentType) { var contentDispositionHeader = System.Net.Http.Headers.ContentDispositionHeaderValue.Parse(contentDisposition); var file = GetFormFile(content, contentDispositionHeader.Name, contentDispositionHeader.FileName, contentDisposition, contentType); _files?.Add(file); }
public ReturnResult UploadFile(IFormFile formFile, string appid) { FormFileCollection files = new FormFileCollection(); files.Add(formFile); _uploadService.UploadSmallFile(appid, files); return(new ReturnResult(null)); }
public async Task FormFileModelBinder_FilesWithQuotedContentDisposition_BindSuccessful() { // Arrange var formFiles = new FormFileCollection(); formFiles.Add(GetMockFormFileWithQuotedContentDisposition("file", "file1.txt")); formFiles.Add(GetMockFormFileWithQuotedContentDisposition("file", "file2.txt")); var httpContext = GetMockHttpContext(GetMockFormCollection(formFiles)); var bindingContext = GetBindingContext(typeof(IEnumerable<IFormFile>), httpContext); var binder = new FormFileModelBinder(); // Act var result = await binder.BindModelAsync(bindingContext); // Assert Assert.NotEqual(ModelBindingResult.NoResult, result); var files = Assert.IsAssignableFrom<IList<IFormFile>>(result.Model); Assert.Equal(2, files.Count); }
public async Task FormFileModelBinder_ExpectSingleFile_BindFirstFile() { // Arrange var formFiles = new FormFileCollection(); formFiles.Add(GetMockFormFile("file", "file1.txt")); formFiles.Add(GetMockFormFile("file", "file2.txt")); var httpContext = GetMockHttpContext(GetMockFormCollection(formFiles)); var bindingContext = GetBindingContext(typeof(IFormFile), httpContext); var binder = new FormFileModelBinder(); // Act var result = await binder.BindModelAsync(bindingContext); // Assert Assert.NotNull(result); var file = Assert.IsAssignableFrom<IFormFile>(result.Model); Assert.Equal("form-data; name=file; filename=file1.txt", file.ContentDisposition); }
public async Task FormFileModelBinder_FilesWithQuotedContentDisposition_BindSuccessful() { // Arrange var formFiles = new FormFileCollection(); formFiles.Add(GetMockFormFileWithQuotedContentDisposition("file", "file1.txt")); formFiles.Add(GetMockFormFileWithQuotedContentDisposition("file", "file2.txt")); var httpContext = GetMockHttpContext(GetMockFormCollection(formFiles)); var bindingContext = GetBindingContext(typeof(IEnumerable <IFormFile>), httpContext); var binder = new FormFileModelBinder(); // Act var result = await binder.BindModelAsync(bindingContext); // Assert Assert.NotEqual(ModelBindingResult.NoResult, result); var files = Assert.IsAssignableFrom <IList <IFormFile> >(result.Model); Assert.Equal(2, files.Count); }
public async Task FormFileModelBinder_ExpectMultipleFiles_BindSuccessful() { // Arrange var formFiles = new FormFileCollection(); formFiles.Add(GetMockFormFile("file", "file1.txt")); formFiles.Add(GetMockFormFile("file", "file2.txt")); var httpContext = GetMockHttpContext(GetMockFormCollection(formFiles)); var bindingContext = GetBindingContext(typeof(IEnumerable <IFormFile>), httpContext); var binder = new FormFileModelBinder(); // Act var result = await binder.BindModelAsync(bindingContext); // Assert Assert.True(result); var files = Assert.IsAssignableFrom <IList <IFormFile> >(bindingContext.Model); Assert.Equal(2, files.Count); }
public async Task FormFileModelBinder_ExpectSingleFile_BindFirstFile() { // Arrange var formFiles = new FormFileCollection(); formFiles.Add(GetMockFormFile("file", "file1.txt")); formFiles.Add(GetMockFormFile("file", "file2.txt")); var httpContext = GetMockHttpContext(GetMockFormCollection(formFiles)); var bindingContext = GetBindingContext(typeof(IFormFile), httpContext); var binder = new FormFileModelBinder(); // Act var result = await binder.BindModelAsync(bindingContext); // Assert Assert.NotEqual(ModelBindingResult.NoResult, result); var file = Assert.IsAssignableFrom <IFormFile>(result.Model); Assert.Equal("form-data; name=file; filename=file1.txt", file.ContentDisposition); }
public async Task UploadAttachmentsIntoStudent_Returns_StudentWithAttachments() { var multipartFormDataFormatter = _container.Resolve <MultipartFormDataFormatter>(); var formFileCollection = new FormFileCollection(); var applicationPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); var attachmentPath = Path.Combine(applicationPath, "Data", "grapefruit-slice-332-332.jpg"); var data = File.ReadAllBytes(attachmentPath); for (var index = 0; index < 3; index++) { var fileName = $"{Guid.NewGuid().ToString("D")}.jpg"; var attachment = new FormFile(new MemoryStream(data), 0, data.Length, $"{nameof(StudentViewModel.Photos)}[{index}]", fileName); attachment.Headers = new HeaderDictionary(); attachment.ContentType = "image/jpeg"; formFileCollection.Add(attachment); } var formCollection = new FormCollection(new Dictionary <string, StringValues>(), formFileCollection); var httpContextMock = new Mock <HttpContext>(); var httpRequestMock = new Mock <HttpRequest>(); httpRequestMock.Setup(x => x.Form) .Returns(formCollection); httpRequestMock.Setup(x => x.ReadFormAsync(It.IsAny <CancellationToken>())) .ReturnsAsync(formCollection); httpContextMock.SetupGet(x => x.Request) .Returns(httpRequestMock.Object); var inputFormatter = new InputFormatterContext(httpContextMock.Object, string.Empty, new ModelStateDictionary(), new EmptyModelMetaData(ModelMetadataIdentity.ForType(typeof(StudentViewModel))), (stream, encoding) => TextReader.Null); var handledResult = await multipartFormDataFormatter .ReadAsync(inputFormatter); Assert.IsInstanceOf <InputFormatterResult>(handledResult); var student = handledResult.Model as StudentViewModel; Assert.NotNull(student?.Photos); Assert.AreEqual(formFileCollection.Count, student.Photos.Count); for (var i = 0; i < formFileCollection.Count; i++) { Assert.AreEqual(formFileCollection[i].FileName, student.Photos[i].FileName); Assert.AreEqual(formFileCollection[i].ContentType, student.Photos[i].ContentType); Assert.AreEqual(formFileCollection[i].Length, student.Photos[i].ContentLength); } }
public void ValidTestPostForm() { //Arrange FormFileCollection formFiles = new FormFileCollection(); using var stream = new FileStream("Data\\Desert.jpg", FileMode.Open, FileAccess.Read, FileShare.Read); formFiles.Add(new FormFile(stream, 0, stream.Length, "image1", "Desert.jpg")); using var stream2 = new FileStream("Data\\Chrysanthemum.jpg", FileMode.Open, FileAccess.Read, FileShare.Read); formFiles.Add(new FormFile(stream, 0, stream.Length, "image2", "Chrysanthemum.jpg")); IFormCollection collection = new FormCollection(new System.Collections.Generic.Dictionary <string, Microsoft.Extensions.Primitives.StringValues>(), files: formFiles); //Act var result = _controller.PostForm(collection); //Assert Assert.IsType <OkResult>(result.Result); }
//Private #region # 读取转换参数至字典 —— IDictionary<string, object> ParseParametersFromBody(... /// <summary> /// 读取转换参数至字典 /// </summary> private IDictionary <string, object> ParseParametersFromBody(HttpRequest request) { string cacheKey = typeof(FileParameterBinding).FullName; if (!request.HttpContext.Items.TryGetValue(cacheKey, out object result)) { IDictionary <string, object> formDatas = new ConcurrentDictionary <string, object>(); foreach (IFormFile formFile in request.Form.Files) { if (formDatas.ContainsKey(formFile.Name)) { object formData = formDatas[formFile.Name]; if (formData is IFormFile prevFile) { FormFileCollection formFiles = new FormFileCollection(); formFiles.Add(prevFile); formFiles.Add(formFile); formDatas[formFile.Name] = formFiles; } if (formData is FormFileCollection existedFiles) { existedFiles.Add(formFile); } } else { formDatas.Add(formFile.Name, formFile); } } foreach (KeyValuePair <string, StringValues> kv in request.Form) { formDatas.Add(kv.Key, kv.Value.ToString()); } result = formDatas; request.HttpContext.Items.Add(cacheKey, result); } return((IDictionary <string, object>)result); }
public void Validate_should_be_valid_if_a_file_is_being_uploaded() { var files = new FormFileCollection(); files.Add(CreateFile(questionId, 1024)); var validator = new FileUploadRequiredValidator(config, page, files); var result = validator.Validate(); result.IsValid.Should().BeTrue(); result.ErrorMessage.Should().BeNull(); }
private void UpdateRequest(HttpRequest request, string data, string name) { var fileCollection = new FormFileCollection(); var formCollection = new FormCollection(new Dictionary <string, string[]>(), fileCollection); var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(data)); request.Form = formCollection; request.ContentType = "multipart/form-data"; request.Headers["Content-Disposition"] = "form-data; name=" + name + "; filename=text.txt"; fileCollection.Add(new FormFile(memoryStream, 0, data.Length) { Headers = request.Headers }); }
public void PostOneForm() { var mock = new Mock <IRepository <ImageEntity> >(); var controller = new ImagesController(mock.Object); var files = new FormFileCollection(); var stream = new MemoryStream(Convert.FromBase64String(_imageModels[0].Base64Data)); files.Add(new FormFile(stream, 0, stream.Length, "sample1", "sample1")); var result = controller.Post(files) as StatusCodeResult; Assert.InRange(result.StatusCode, 200, 299); mock.Verify(i => i.Add(It.IsAny <ImageEntity>()), Times.Once()); }
private void UpdateRequest(HttpRequest request, string data, string name) { const string fileName = "text.txt"; var fileCollection = new FormFileCollection(); var formCollection = new FormCollection(new Dictionary <string, StringValues>(), fileCollection); var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(data)); request.Form = formCollection; request.ContentType = "multipart/form-data; boundary=----WebKitFormBoundarymx2fSWqWSd0OxQqq"; request.Headers["Content-Disposition"] = $"form-data; name={name}; filename={fileName}"; fileCollection.Add(new FormFile(memoryStream, 0, data.Length, name, fileName) { Headers = request.Headers }); }
public async Task FormFileModelBinder_ReturnsFailedResult_WithNoFileNameAndZeroLength() { // Arrange var formFiles = new FormFileCollection(); formFiles.Add(GetMockFormFile("file", "")); var httpContext = GetMockHttpContext(GetMockFormCollection(formFiles)); var bindingContext = GetBindingContext(typeof(IFormFile), httpContext); var binder = new FormFileModelBinder(NullLoggerFactory.Instance); // Act await binder.BindModelAsync(bindingContext); // Assert Assert.False(bindingContext.Result.IsModelSet); Assert.Null(bindingContext.Result.Model); }
public async Task FormFileModelBinder_ReturnsNoResult_WithNoFileNameAndZeroLength() { // Arrange var formFiles = new FormFileCollection(); formFiles.Add(GetMockFormFile("file", "")); var httpContext = GetMockHttpContext(GetMockFormCollection(formFiles)); var bindingContext = GetBindingContext(typeof(IFormFile), httpContext); var binder = new FormFileModelBinder(); // Act var result = await binder.BindModelAsync(bindingContext); // Assert Assert.NotEqual(ModelBindingResult.NoResult, result); Assert.Null(result.Model); }
public async Task FormFileModelBinder_ReturnsNoResult_WithEmptyContentDisposition() { // Arrange var formFiles = new FormFileCollection(); formFiles.Add(new Mock <IFormFile>().Object); var httpContext = GetMockHttpContext(GetMockFormCollection(formFiles)); var bindingContext = GetBindingContext(typeof(IFormFile), httpContext); var binder = new FormFileModelBinder(); // Act var result = await binder.BindModelAsync(bindingContext); // Assert Assert.NotEqual(ModelBindingResult.NoResult, result); Assert.Null(result.Model); }
public async Task FormFileModelBinder_ReturnsNoResult_WhenNamesDontMatch() { // Arrange var formFiles = new FormFileCollection(); formFiles.Add(GetMockFormFile("different name", "file1.txt")); var httpContext = GetMockHttpContext(GetMockFormCollection(formFiles)); var bindingContext = GetBindingContext(typeof(IFormFile), httpContext); var binder = new FormFileModelBinder(); // Act var result = await binder.BindModelAsync(bindingContext); // Assert Assert.NotEqual(ModelBindingResult.NoResult, result); Assert.Null(result.Model); }
public async Task FormFileModelBinder_ReturnsFailedResult_WithEmptyContentDisposition() { // Arrange var formFiles = new FormFileCollection(); formFiles.Add(new Mock <IFormFile>().Object); var httpContext = GetMockHttpContext(GetMockFormCollection(formFiles)); var bindingContext = GetBindingContext(typeof(IFormFile), httpContext); var binder = new FormFileModelBinder(NullLoggerFactory.Instance); // Act await binder.BindModelAsync(bindingContext); // Assert Assert.False(bindingContext.Result.IsModelSet); Assert.Null(bindingContext.Result.Model); }
public async Task FormFileModelBinder_ReturnsFailedResult_WhenNamesDoNotMatch() { // Arrange var formFiles = new FormFileCollection(); formFiles.Add(GetMockFormFile("different name", "file1.txt")); var httpContext = GetMockHttpContext(GetMockFormCollection(formFiles)); var bindingContext = GetBindingContext(typeof(IFormFile), httpContext); var binder = new FormFileModelBinder(); // Act await binder.BindModelAsync(bindingContext); // Assert Assert.False(bindingContext.Result.IsModelSet); Assert.Null(bindingContext.Result.Model); }
public void ContainsPrefix_ReturnsTrue_IfFileExists() { // Arrange var httpContext = new DefaultHttpContext(); httpContext.Request.ContentType = "multipart/form-data"; var formFiles = new FormFileCollection(); formFiles.Add(new FormFile(Stream.Null, 0, 10, "file", "file")); httpContext.Request.Form = new FormCollection(new Dictionary <string, StringValues>(), formFiles); var valueProvider = new FormFileValueProvider(formFiles); // Act var result = valueProvider.ContainsPrefix("file"); // Assert Assert.True(result); }
public void GetValue_ReturnsNoneResult() { // Arrange var httpContext = new DefaultHttpContext(); httpContext.Request.ContentType = "multipart/form-data"; var formFiles = new FormFileCollection(); formFiles.Add(new FormFile(Stream.Null, 0, 10, "file", "file")); httpContext.Request.Form = new FormCollection(new Dictionary <string, StringValues>(), formFiles); var valueProvider = new FormFileValueProvider(formFiles); // Act var result = valueProvider.GetValue("file"); // Assert Assert.Equal(ValueProviderResult.None, result); }
public IFormCollection GetFormData([FromServices] IHostingEnvironment hostingEnvironment) { FormFileCollection formFiles = new FormFileCollection(); var path = Path.Combine($"{hostingEnvironment.ContentRootPath}", "StaticSource", "Images", "a.jpg"); var stream = System.IO.File.OpenRead(path); var formFile = new FormFile(stream, 0, stream.Length, "myFile", "test.jpg"); //formFile.ContentType = "image/jpg";//bug 设置会抛异常 formFiles.Add(formFile);//无效 FormCollection form = new FormCollection(new Dictionary <string, Microsoft.Extensions.Primitives.StringValues>() { { "key1", "测试1" }, { "key2", "测试2" }, { "key3", "测试3" }, { "key4", "测试4" } }, formFiles); return(form); }
public async Task FormFileModelBinder_SingleFile_BindSuccessful() { // Arrange var formFiles = new FormFileCollection(); formFiles.Add(GetMockFormFile("file", "file1.txt")); var httpContext = GetMockHttpContext(GetMockFormCollection(formFiles)); var bindingContext = GetBindingContext(typeof(IEnumerable <IFormFile>), httpContext); var binder = new FormFileModelBinder(); // Act await binder.BindModelAsync(bindingContext); // Assert Assert.True(bindingContext.Result.IsModelSet); var entry = bindingContext.ValidationState[bindingContext.Result.Model]; Assert.False(entry.SuppressValidation); Assert.Equal("file", entry.Key); Assert.Null(entry.Metadata); }
public IActionResult Contact(ContactBindingModel model) { if (ModelState.IsValid) { //to do security check var attachment = new FormFileCollection(); if (model.UploadImage != null) { attachment.Add(model.UploadImage); } string content = $"<p><strong>Unregistered User</strong></p><p><strong> Full Name:</strong> {model.FullName} </p>" + $"<p><strong>Phone: </strong>{model.Phone}</p><p><p><strong>Email:</strong>{model.Email}</p><p><strong> Message:</strong ></p><p>{model.Message}</p>"; var message = new MailMessage(new string[] { model.Email }, //to do change email "Photo Album Contact Form", content, attachment); _emailSender.SendEmail(message); return(RedirectToAction(nameof(ContactSent))); } return(View(model)); }
private void UpdateRequest(HttpRequest request, string data, string name) { var fileCollection = new FormFileCollection(); var formCollection = new FormCollection(new Dictionary <string, string[]>(), fileCollection); request.Form = formCollection; request.ContentType = "multipart/form-data; boundary=----WebKitFormBoundarymx2fSWqWSd0OxQqq"; if (string.IsNullOrEmpty(data) || string.IsNullOrEmpty(name)) { // Leave the submission empty. return; } request.Headers["Content-Disposition"] = "form-data; name=" + name + "; filename=text.txt"; var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(data)); fileCollection.Add(new FormFile(memoryStream, 0, data.Length) { Headers = request.Headers }); }
public async void CreateRoomChatWithFile() { var request = new Mock <HttpRequest>(); var formFile = new Mock <IFormFile>(); var PhysicalFile = new FileInfo(@"../../../File/software-762486_1920.jpg"); var memory = new MemoryStream(); var writer = new StreamWriter(memory); writer.Write(PhysicalFile.OpenRead()); writer.Flush(); memory.Position = 0; var fileName = PhysicalFile.Name; formFile.Setup(_ => _.FileName).Returns(fileName); formFile.Setup(_ => _.Length).Returns(memory.Length); formFile.Setup(_ => _.OpenReadStream()).Returns(memory); formFile.Verify(); var file = formFile.Object; var files = new FormFileCollection(); files.Add(file); var formCol = new FormCollection(new Dictionary <string, Microsoft.Extensions.Primitives.StringValues> { { "chatType", "2" }, { "roomId", "1" }, { "userId", "TestUser" }, { "content", "" } }, files); request.Setup(req => req.Form).Returns(formCol); var result = await RoomService.CreateRoomChat(_context, request.Object, _env.Object); Assert.Equal((int)HttpStatusCode.OK, ((ObjectResult)result).StatusCode); }
public async Task<IFormCollection> ReadFormAsync(CancellationToken cancellationToken) { if (Form != null) { return Form; } if (!HasFormContentType) { throw new InvalidOperationException("Incorrect Content-Type: " + _request.ContentType); } cancellationToken.ThrowIfCancellationRequested(); _request.EnableRewind(); IDictionary<string, StringValues> formFields = null; var files = new FormFileCollection(); // Some of these code paths use StreamReader which does not support cancellation tokens. using (cancellationToken.Register(_request.HttpContext.Abort)) { var contentType = ContentType; // Check the content-type if (HasApplicationFormContentType(contentType)) { var encoding = FilterEncoding(contentType.Encoding); formFields = await FormReader.ReadFormAsync(_request.Body, encoding, cancellationToken); } else if (HasMultipartFormContentType(contentType)) { var formAccumulator = new KeyValueAccumulator(); var boundary = GetBoundary(contentType); var multipartReader = new MultipartReader(boundary, _request.Body); var section = await multipartReader.ReadNextSectionAsync(cancellationToken); while (section != null) { var headers = new HeaderDictionary(section.Headers); ContentDispositionHeaderValue contentDisposition; ContentDispositionHeaderValue.TryParse(headers[HeaderNames.ContentDisposition], out contentDisposition); if (HasFileContentDisposition(contentDisposition)) { // Find the end await section.Body.DrainAsync(cancellationToken); var file = new FormFile(_request.Body, section.BaseStreamOffset.Value, section.Body.Length) { Headers = headers, }; files.Add(file); } else if (HasFormDataContentDisposition(contentDisposition)) { // Content-Disposition: form-data; name="key" // // value var key = HeaderUtilities.RemoveQuotes(contentDisposition.Name); MediaTypeHeaderValue mediaType; MediaTypeHeaderValue.TryParse(headers[HeaderNames.ContentType], out mediaType); var encoding = FilterEncoding(mediaType?.Encoding); using (var reader = new StreamReader(section.Body, encoding, detectEncodingFromByteOrderMarks: true, bufferSize: 1024, leaveOpen: true)) { var value = await reader.ReadToEndAsync(); formAccumulator.Append(key, value); } } else { System.Diagnostics.Debug.Assert(false, "Unrecognized content-disposition for this section: " + headers[HeaderNames.ContentDisposition]); } section = await multipartReader.ReadNextSectionAsync(cancellationToken); } formFields = formAccumulator.GetResults(); } } // Rewind so later readers don't have to. _request.Body.Seek(0, SeekOrigin.Begin); Form = new FormCollection(formFields, files); return Form; }
private static void SetFormFileBodyContent(HttpRequest request, string content, string name) { var fileCollection = new FormFileCollection(); var formCollection = new FormCollection(new Dictionary<string, string[]>(), fileCollection); var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(content)); request.Form = formCollection; request.ContentType = "multipart/form-data"; request.Headers["Content-Disposition"] = "form-data; name=" + name + "; filename=text.txt"; fileCollection.Add(new FormFile(memoryStream, 0, memoryStream.Length) { Headers = request.Headers }); }
private void UpdateRequest(HttpRequest request, string data, string name) { var fileCollection = new FormFileCollection(); var formCollection = new FormCollection(new Dictionary<string, string[]>(), fileCollection); var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(data)); request.Form = formCollection; request.ContentType = "multipart/form-data; boundary=----WebKitFormBoundarymx2fSWqWSd0OxQqq"; request.Headers["Content-Disposition"] = "form-data; name=" + name + "; filename=text.txt"; fileCollection.Add(new FormFile(memoryStream, 0, data.Length) { Headers = request.Headers }); }
private static void SetFormFileBodyContent(HttpRequest request, string content, string name) { const string fileName = "text.txt"; var fileCollection = new FormFileCollection(); var formCollection = new FormCollection(new Dictionary<string, StringValues>(), fileCollection); var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(content)); request.Form = formCollection; request.ContentType = "multipart/form-data; boundary=----WebKitFormBoundarymx2fSWqWSd0OxQqq"; request.Headers["Content-Disposition"] = $"form-data; name={name}; filename={fileName}"; fileCollection.Add(new FormFile(memoryStream, 0, memoryStream.Length, name, fileName) { Headers = request.Headers }); }
public async Task FormFileModelBinder_UsesFieldNameForTopLevelObject(bool isTopLevel, string expected) { // Arrange var formFiles = new FormFileCollection(); formFiles.Add(GetMockFormFile("FieldName", "file1.txt")); formFiles.Add(GetMockFormFile("ModelName", "file1.txt")); var httpContext = GetMockHttpContext(GetMockFormCollection(formFiles)); var bindingContext = GetBindingContext(typeof(IFormFile), httpContext); bindingContext.IsTopLevelObject = isTopLevel; bindingContext.FieldName = "FieldName"; bindingContext.ModelName = "ModelName"; var binder = new FormFileModelBinder(); // Act var result = await binder.BindModelAsync(bindingContext); // Assert Assert.NotEqual(ModelBindingResult.NoResult, result); Assert.True(result.IsModelSet); var file = Assert.IsAssignableFrom<IFormFile>(result.Model); ContentDispositionHeaderValue contentDisposition; ContentDispositionHeaderValue.TryParse(file.ContentDisposition, out contentDisposition); Assert.Equal(expected, contentDisposition.Name); }
private void UpdateRequest(HttpRequest request, string data, string name) { const string fileName = "text.txt"; var fileCollection = new FormFileCollection(); var formCollection = new FormCollection(new Dictionary<string, StringValues>(), fileCollection); request.Form = formCollection; request.ContentType = "multipart/form-data; boundary=----WebKitFormBoundarymx2fSWqWSd0OxQqq"; if (string.IsNullOrEmpty(data) || string.IsNullOrEmpty(name)) { // Leave the submission empty. return; } request.Headers["Content-Disposition"] = $"form-data; name={name}; filename={fileName}"; var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(data)); fileCollection.Add(new FormFile(memoryStream, 0, data.Length, name, fileName) { Headers = request.Headers }); }