Skip to content

Commit a054e1d

Browse files
authored
[Blazor] Fix IBrowserFile Name property to return FileName instead of form field name (#63238)
1 parent f4e259a commit a054e1d

File tree

4 files changed

+114
-9
lines changed

4 files changed

+114
-9
lines changed

src/Components/Endpoints/src/FormMapping/BrowserFileFromFormFile.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Components.Endpoints.FormMapping;
99

1010
internal sealed class BrowserFileFromFormFile(IFormFile formFile) : IBrowserFile
1111
{
12-
public string Name => formFile.Name;
12+
public string Name => formFile.FileName;
1313

1414
public DateTimeOffset LastModified => DateTimeOffset.Parse(formFile.Headers.LastModified.ToString(), CultureInfo.InvariantCulture);
1515

src/Components/Endpoints/test/Binding/FormDataMapperTests.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2024,7 +2024,7 @@ public void CanDeserialize_ComplexType_CanSerializerBrowserFile()
20242024

20252025
// Assert
20262026
var browserFile = Assert.IsAssignableFrom<IBrowserFile>(result);
2027-
Assert.Equal("file", browserFile.Name);
2027+
Assert.Equal("file.txt", browserFile.Name);
20282028
Assert.Equal(expectedString.Length, browserFile.Size);
20292029
var buffer = new byte[browserFile.Size];
20302030
browserFile.OpenReadStream().Read(buffer);
@@ -2059,18 +2059,18 @@ public void CanDeserialize_ComplexType_CanSerializerIReadOnlyListBrowserFile()
20592059
var browserFiles = Assert.IsAssignableFrom<IReadOnlyList<IBrowserFile>>(result);
20602060
// First file
20612061
var browserFile1 = browserFiles[0];
2062-
Assert.Equal("file", browserFile1.Name);
2062+
Assert.Equal("file1.txt", browserFile1.Name);
20632063
Assert.Equal(expectedString1.Length, browserFile1.Size);
20642064
var buffer1 = new byte[browserFile1.Size];
20652065
browserFile1.OpenReadStream().Read(buffer1);
20662066
Assert.Equal(expectedString1, Encoding.UTF8.GetString(buffer1, 0, buffer1.Length));
20672067
// Second files
2068-
var browserFile2 = browserFiles[0];
2069-
Assert.Equal("file", browserFile2.Name);
2070-
Assert.Equal(expectedString1.Length, browserFile2.Size);
2068+
var browserFile2 = browserFiles[1];
2069+
Assert.Equal("file2.txt", browserFile2.Name);
2070+
Assert.Equal(expectedString2.Length, browserFile2.Size);
20712071
var buffer2 = new byte[browserFile2.Size];
2072-
browserFile1.OpenReadStream().Read(buffer2);
2073-
Assert.Equal(expectedString1, Encoding.UTF8.GetString(buffer2, 0, buffer2.Length));
2072+
browserFile2.OpenReadStream().Read(buffer2);
2073+
Assert.Equal(expectedString2, Encoding.UTF8.GetString(buffer2, 0, buffer2.Length));
20742074
}
20752075

20762076
[Fact]
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
using System.Globalization;
5+
using Microsoft.AspNetCore.Components.Endpoints.FormMapping;
6+
using Microsoft.AspNetCore.Components.Forms;
7+
using Microsoft.AspNetCore.Http;
8+
using Microsoft.Extensions.Primitives;
9+
using Moq;
10+
11+
namespace Microsoft.AspNetCore.Components.Endpoints.Tests.FormMapping;
12+
13+
public class BrowserFileFromFormFileTests
14+
{
15+
[Fact]
16+
public void Name_ReturnsFormFileFileName_NotFormFileName()
17+
{
18+
// Arrange
19+
const string expectedFileName = "document.pdf";
20+
const string formFieldName = "fileInput";
21+
22+
var mockFormFile = new Mock<IFormFile>();
23+
mockFormFile.Setup(x => x.FileName).Returns(expectedFileName);
24+
mockFormFile.Setup(x => x.Name).Returns(formFieldName);
25+
26+
var browserFile = new BrowserFileFromFormFile(mockFormFile.Object);
27+
28+
// Act
29+
var actualName = browserFile.Name;
30+
31+
// Assert
32+
Assert.Equal(expectedFileName, actualName);
33+
Assert.NotEqual(formFieldName, actualName);
34+
}
35+
36+
[Fact]
37+
public void TryRead_IBrowserFile_ReturnsCorrectFileName()
38+
{
39+
// Arrange
40+
const string prefixName = "fileInput";
41+
const string expectedFileName = "upload.txt";
42+
var culture = CultureInfo.GetCultureInfo("en-US");
43+
44+
var mockFormFile = new Mock<IFormFile>();
45+
mockFormFile.Setup(x => x.FileName).Returns(expectedFileName);
46+
mockFormFile.Setup(x => x.Name).Returns(prefixName);
47+
48+
var formFileCollection = new Mock<IFormFileCollection>();
49+
formFileCollection.Setup(x => x.GetFile(prefixName)).Returns(mockFormFile.Object);
50+
51+
var buffer = prefixName.ToCharArray().AsMemory();
52+
var reader = new FormDataReader(new Dictionary<FormKey, StringValues>(), culture, buffer, formFileCollection.Object);
53+
reader.PushPrefix(prefixName);
54+
55+
var converter = new FileConverter<IBrowserFile>();
56+
57+
// Act
58+
var result = converter.TryRead(ref reader, typeof(IBrowserFile), default!, out var browserFile, out var found);
59+
60+
// Assert
61+
Assert.True(result);
62+
Assert.True(found);
63+
Assert.NotNull(browserFile);
64+
Assert.Equal(expectedFileName, browserFile.Name);
65+
}
66+
67+
[Fact]
68+
public void TryRead_IBrowserFileList_ReturnsCorrectFileNames()
69+
{
70+
// Arrange
71+
const string prefixName = "fileInputs";
72+
const string expectedFileName1 = "file1.txt";
73+
const string expectedFileName2 = "file2.jpg";
74+
var culture = CultureInfo.GetCultureInfo("en-US");
75+
76+
var mockFormFile1 = new Mock<IFormFile>();
77+
mockFormFile1.Setup(x => x.FileName).Returns(expectedFileName1);
78+
mockFormFile1.Setup(x => x.Name).Returns(prefixName);
79+
80+
var mockFormFile2 = new Mock<IFormFile>();
81+
mockFormFile2.Setup(x => x.FileName).Returns(expectedFileName2);
82+
mockFormFile2.Setup(x => x.Name).Returns(prefixName);
83+
84+
var formFiles = new List<IFormFile> { mockFormFile1.Object, mockFormFile2.Object };
85+
var formFileCollection = new Mock<IFormFileCollection>();
86+
formFileCollection.Setup(x => x.GetFiles(prefixName)).Returns(formFiles);
87+
88+
var buffer = prefixName.ToCharArray().AsMemory();
89+
var reader = new FormDataReader(new Dictionary<FormKey, StringValues>(), culture, buffer, formFileCollection.Object);
90+
reader.PushPrefix(prefixName);
91+
92+
var converter = new FileConverter<IReadOnlyList<IBrowserFile>>();
93+
94+
// Act
95+
var result = converter.TryRead(ref reader, typeof(IReadOnlyList<IBrowserFile>), default!, out var browserFiles, out var found);
96+
97+
// Assert
98+
Assert.True(result);
99+
Assert.True(found);
100+
Assert.NotNull(browserFiles);
101+
Assert.Equal(2, browserFiles.Count);
102+
Assert.Equal(expectedFileName1, browserFiles[0].Name);
103+
Assert.Equal(expectedFileName2, browserFiles[1].Name);
104+
}
105+
}

src/Components/test/E2ETest/ServerRenderingTests/FormHandlingTests/FormWithParentBindingContextTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1365,7 +1365,7 @@ public void CanBindToFormWithFiles()
13651365
Assert.Equal($"Profile Picture: {profilePicture.Name}", Browser.Exists(By.Id("profile-picture")).Text);
13661366
Assert.Equal("Documents: 2", Browser.Exists(By.Id("documents")).Text);
13671367
Assert.Equal("Images: 3", Browser.Exists(By.Id("images")).Text);
1368-
Assert.Equal("Header Photo: Model.HeaderPhoto", Browser.Exists(By.Id("header-photo")).Text);
1368+
Assert.Equal($"Header Photo: {headerPhoto.Name}", Browser.Exists(By.Id("header-photo")).Text);
13691369
Assert.Equal("Total: 7", Browser.Exists(By.Id("form-collection")).Text);
13701370
}
13711371

0 commit comments

Comments
 (0)