Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 如何在.Net核心Web Api中上载目录?_Angular_Asp.net Core_Asp.net Web Api - Fatal编程技术网

Angular 如何在.Net核心Web Api中上载目录?

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(角度)如

我在.NETCore中看到了一些关于文件/文件上传的教程,但我看不到关于上传目录的教程。因此,我想上传所选文件夹中的所有文件和文件夹。(文件夹本身也包括在内。)

例如,有这样一个目录树(目录
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);
    }

}