InputFile在内存中是否有完整路径



请检查下面的代码。我想要完整路径来代替传递的文件名,以解析json文件。

我知道InputFile没有提供有关用户文件系统的完整路径信息,这些信息可能在某些方面被利用。但我必须将这个选定文件的完整路径从razor传递到index.js.

InputFile是否可能在内存中有这个完整路径,并且这个完整路径内存变量可以在index.js中传递和访问,而不会向用户透露实际的文件路径?非常感谢。

以下代码:

剃刀页面:

<button onclick="document.getElementById('flpicker').click()">choose file</button>
<InputFile id="flpicker" OnChange="@OnInputFileChange" hidden multiple />

private async Task OnInputFileChange(InputFileChangeEventArgs e)
{    
foreach (var File in e.GetMultipleFiles(e.FileCount))
{
var fileName = File.Name;       
}
await JSRuntime.InvokeVoidAsync("Create", fileName);
}

index.js:

function create(fileName){
$.getJSON(fileName, function (data) {
....
});
}

编辑:

AppState.cs:

public string? json
{
get;
set;
}

page1.剃须刀:

private IBrowserFile _loadedFile;
private async Task OnInputFileChange(InputFileChangeEventArgs e)
{   
_loadedFile = e.File;
var utf8Json = _loadedFile.OpenReadStream(maxAllowedSize: 1024 * 1024 * 10); 
try
{
var jsonDocument = await JsonDocument.ParseAsync(utf8Json);
AppState.json = jsonDocument @* I understand can't convert to string *@ 
}
catch (JsonException ex)
{
Console.WriteLine(ex.Message);
}
}

page2.剃须刀:

protected override async Task OnAfterRenderAsync(bool firstRender)
{
await JSRuntime.InvokeVoidAsync("Create", AppState.json);
}

即使您获得了文件的完整路径,$.getJSON(fileName, ...);也不会工作,原因与您提到的相同:

可能被利用

您无法从JavaScript访问用户的文件系统。此外,当用户已经上传了整个文件时,这样做也没有意义。您的内存中已经有该文件,为什么要使用$.getJSON()再次获取它?您可以直接传递文件,而不是将fileName传递给js函数。

示例:

@using System.Text.Json
@inject IJSRuntime JS
<InputFile OnChange="LoadFile" />
<p>Loaded file: @_loadedFile?.Name</p>
<button @onclick="Submit">Submit</button>
@code {
private IBrowserFile? _loadedFile;
private void LoadFile(InputFileChangeEventArgs e)
{
_loadedFile = e.File;
}
private async Task Submit()
{
if (_loadedFile == null)
{
return;
}
var utf8Json = _loadedFile.OpenReadStream(maxAllowedSize: 1024 * 1024 * 10); // 10MB
try
{
JsonDocument? jsonDocument = await JsonDocument.ParseAsync(utf8Json);
await JS.InvokeVoidAsync("create", jsonDocument);
}
catch (JsonException ex)
{
Console.WriteLine(ex.Message);
}
}
}

最新更新