Angular 如何在.Net核心Web Api中上载目录?
我在.NETCore中看到了一些关于文件/文件上传的教程,但我看不到关于上传目录的教程。因此,我想上传所选文件夹中的所有文件和文件夹。(文件夹本身也包括在内。) 例如,有这样一个目录树(目录Angular 如何在.Net核心Web Api中上载目录?,angular,asp.net-core,asp.net-web-api,Angular,Asp.net Core,Asp.net Web Api,我在.NETCore中看到了一些关于文件/文件上传的教程,但我看不到关于上传目录的教程。因此,我想上传所选文件夹中的所有文件和文件夹。(文件夹本身也包括在内。) 例如,有这样一个目录树(目录a包含file1.txt和目录B。目录B只包含file2.txt): 我想把目录A上传到服务器目录D\E\F。因此,我在GUI中选择目录A。上传后,我想在D\E\F\A路径中查看目录A内容 在下面的代码中,我可以在前端选择一个文件夹,但它只复制文件夹的一个文件。我该怎么办 我有一个非常基本的HTML(角度)如
a
包含file1.txt
和目录B
。目录B
只包含file2.txt
):
我想把目录A
上传到服务器目录D\E\F
。因此,我在GUI中选择目录A
。上传后,我想在D\E\F\A
路径中查看目录A
内容
在下面的代码中,我可以在前端选择一个文件夹,但它只复制文件夹的一个文件。我该怎么办
我有一个非常基本的HTML(角度)
如下:
<div class="row" style="margin-bottom:15px;">
<div class="col-md-3">
<input webkitdirectory directory type="file" #file placeholder="Choose file" (change)="uploadFile(file.files)" style="display:none;">
<button type="button" class="btn btn-success" (click)="file.click()">Upload File</button>
</div>
<div class="col-md-4">
<span class="upload" *ngIf="progress > 0">
{{progress}}%
</span>
<span class="upload" *ngIf="message">
{{message}}
</span>
</div>
</div>
服务器(.net核心)
端:
[HttpPost("file")]
public async Task UploadFile(IFormFile file)
{
var filePath = Path.Combine(Directory.GetCurrentDirectory(), @"\\UBUNTU-N55SL\\cloudStorage", file.FileName);
using (var fileStream = new FileStream(filePath, FileMode.Create))
{
await file.CopyToAsync(fileStream);
}
}
目录不同于文件,因为它们本身不是数据,而是存储的逻辑结构。由于目录根据服务器的操作系统以不同的方式处理,因此它们不会包含在文件上载操作中。您可以考虑使用FTP,但出于发布代码的目的,您需要循环浏览要上载的目录和文件,并使用代码逻辑将它们放置在所需的目标目录中。如何在服务器端循环目录结构?循环需要客户端,并将执行每个文件的单独上载。服务器不会做任何不同的事情。但是当我在循环时遇到一个内部目录时,我应该怎么做?这将取决于用户。出于安全原因,web客户机不能只通过用户的文件访问它想要的任何内容。因此,循环需要在UI上进行,以不断提示用户选择下一个文件。不是特别好的用户体验!这就是为什么你没有找到目录上传的例子。这在web应用程序中普遍适用,与WebApi、.Net Core或Angular无关。所以您可能希望研究其他方法,例如让用户先压缩文件夹,以便只上载一个文件,或者可能从网页移开并使用FTP衍生工具。
public uploadFile = (files) => {
if (files.length === 0) {
return;
}
let fileToUpload = <File>files[0];
const formData = new FormData();
formData.append('file', fileToUpload, fileToUpload.name);
this.httpClient.post(`http://192.168.1.10:58432/file`, formData, {reportProgress: true, observe: 'events'})
.subscribe(event => {
if (event.type === HttpEventType.UploadProgress)
this.progress = Math.round(100 * event.loaded / event.total);
else if (event.type === HttpEventType.Response) {
this.message = 'Upload success.';
this.onUploadFinished.emit(event.body);
}
});
}
[HttpPost("file")]
public async Task UploadFile(IFormFile file)
{
var filePath = Path.Combine(Directory.GetCurrentDirectory(), @"\\UBUNTU-N55SL\\cloudStorage", file.FileName);
using (var fileStream = new FileStream(filePath, FileMode.Create))
{
await file.CopyToAsync(fileStream);
}
}