Пример #1
1
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        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);
        }
Пример #6
0
        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);
        }
Пример #7
0
        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);
        }
Пример #8
0
        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));
        }
Пример #10
0
        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);
        }
Пример #11
0
        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);
        }
Пример #12
0
        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);
        }
Пример #13
0
        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);
        }
Пример #14
0
        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);
            }
        }
Пример #16
0
        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();
        }
Пример #19
0
        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
            });
        }
Пример #20
0
        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());
        }
Пример #21
0
        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
            });
        }
Пример #22
0
        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);
        }
Пример #23
0
        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);
        }
Пример #24
0
        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);
        }
Пример #25
0
        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);
        }
Пример #26
0
        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);
        }
Пример #27
0
        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);
        }
Пример #28
0
    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);
    }
Пример #29
0
    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);
    }
Пример #30
0
        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);
        }
Пример #31
0
        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);
        }
Пример #32
0
        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
            });
        }
Пример #34
0
        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);
        }
Пример #35
0
        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
            });
        }
Пример #38
0
        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);
        }
        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
            });
        }
Пример #40
0
        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);
        }
Пример #41
0
        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);
        }
        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
            });
        }