【问题标题】:Angular 4: How to read content of text file with HTTPClientAngular 4:如何使用 HTTPClient 读取文本文件的内容
【发布时间】:2018-04-13 16:19:41
【问题描述】:

我的 Angular 4 项目目录中有一个 .txt 文件,我想阅读它的内容。怎么做 ?下面是我使用的代码。

该文件位于“app”文件夹内的“files”文件夹中。 我拥有 HTTPClient 代码的组件位于“app”文件夹内的“httpclient”文件夹中。

意思是“文件”文件夹和“httpclient”文件夹是子文件夹。

代码如下所示。它无法正常工作,因为我收到 404 错误 - 'GET http://localhost:4200/files/1.txt 404 (Not Found)'

this.http.get('/files/1.txt').subscribe(data => {
        console.log(data);
    },
        (err: HttpErrorResponse) => {
            if (err.error instanceof Error) {
                // A client-side or network error occurred. Handle it accordingly.
                console.log('An error occurred:', err.error.message);
            } else {
                // The backend returned an unsuccessful response code.
                // The response body may contain clues as to what went wrong,
                console.log(`Backend returned code ${err.status}, body was: ${err.error}`);
            }
        }
    );

【问题讨论】:

  • 您尝试过相对 URL 吗? (即http.get('files/1.txt') -- 没有初始斜线)或者将文件放在assets 文件夹中,我相信它的内容会被复制到站点的根目录中。
  • 是的,我刚才试过了,同样的错误。它没有找到它 - 404。怎么了?我只是遵循官方 Angular 文档angular.io/guide/http#requesting-non-json-data 的代码
  • 你的文件路径正确吗?
  • 是的,文件路径是正确的。即使我将文本文件移动到组件的同一文件夹并执行 this.http.get('./1.txt') 我也会收到相同的错误。
  • @yogihosting 它不起作用,因为当 CLI 使用 ng serve 构建项目时,它只处理 .ts、.html 和 .css 文件。 .txt 文件等静态资源不属于您的代码,它们会被ng serve 删除。

标签: javascript angular


【解决方案1】:

试试这样:

this.http.get('app/files/1.txt').subscribe(data => {
    console.log(data.text());
})

CLI 无法访问您项目的 app 目录中的文档。如果你移动到文本文档,你可以访问像assets/1.txt这样的文本文件。

如果你想访问 app 目录中的文档,你需要在 .angular-cli.json

的 assets 数组中添加路径

.angular-cli.json

"assets": [
  "assets",
  "app", /* add this line to access document inside the app directory */
  "favicon.ico"
]

下面是我的示例尝试这样:

this.http.get('app/home/1.txt').subscribe(data => {
    console.log('data', data.text());
})

【讨论】:

  • 是的资产文件是可访问的,但我如何评估保存在单独文件夹中的文件?
  • 您需要在 assets 数组中的 angular-cli.json 文件中添加 app 。然后你就可以访问它了。并导入重新运行项目
  • 我在 angular-cli.json 中添加了应用程序,但仍然无法正常工作。
  • @yogihosting 在 assets 数组中添加 app 之后。您需要重新运行项目或重新启动项目
  • 你太棒了!我必须重新启动我的角度项目。我正在使用vs代码。所以我关闭它并重新打开它并再次运行该应用程序。现在我可以评估它了。这里的代码是 this.http.get('app/files/1.txt', {responseType: 'text'})
【解决方案2】:

角度 6/7

{ responseType: 'text' as 'json'}

暂时有效

this.http.get("app/files/1.txt", { responseType: 'text' as 'json'}).subscribe(data => {
    console.log(data.text());
})

完整讨论请参阅 GitHub 上的this ticket

【讨论】:

    【解决方案3】:

    只是对上一个答案的一个更正: 在选项中添加“responseType:'text'”:

    this.http.get("app/files/1.txt", "{ responseType: 'text' }").subscribe(data => {
        console.log(data.text());
    })
    

    【讨论】:

    • 这里,在 2020 年 1 月,必须删除 text() 方法……如果是这样,则此代码有效。
    【解决方案4】:

    这是在Angular 6中测试的

    使用

    创建服务
    import { Injectable } from '@angular/core';
    import { HttpClient } from '@angular/common/http'; 
    //Read  text file
    export interface ResultJson{
    
    }
    @Injectable({
      providedIn: 'root'
    })
    export class TestService {
      urlEncoded = '/Test.text';
      getText(){
        return this.http.get(this.urlEncoded, {responseType: 'text'});
      }
    }
    

    并在您的组件中调用服务,如下所示

      resultJSON: ResultJson;
      ResultJsonString : any;
    this
        .testService
        .getText()
        .subscribe((data:ResultJson) => {
             this.ResultJsonString = data;
           });
    

    希望对你有帮助

    【讨论】:

      【解决方案5】:

      我能够通过 Angular 6 项目获取本地文件 (JSON)。

      项目结构:

      |-src
      |--app
      |---core
      |---...
      |---app.module.ts
      |--assets
      |...
      

      步骤:

      1) 在angular.json 中,我添加了放置文件的文件夹:

       "projects": {
          "my-project": {
            "root": "",
            "sourceRoot": "src", // ** my project root is "src" folder
            "projectType": "application",
            "architect": {
              "build": {
                "builder": "@angular-devkit/build-angular:browser",
                "options": {
                  // ...
                  "assets": [
                    "src",         // <--- ADDED THIS
                    "src/assets",
                    "src/favicon.ico",
                    "src/manifest.json",
                    "src/robots.txt",
                    "src/web.config"
                  ]
      

      2) 编写以下服务来获取文件:

      import { HttpClient } from '@angular/common/http'
      import { Injectable } from '@angular/core'
      
      @Injectable({
         providedIn: 'root'
      })
      export class EnvironmentService {
         constructor(private readonly _httpClient: HttpClient) {
         }
      
         public init(): Promise<any> {       
            return new Promise(resolve =>
               this._httpClient
               .get('file.json')
               .first()
               .subscribe((data: any) => {
                  // data from JSON
                  resolve()
               })
            )
         }
      }
      

      奖金
      如果您想读取自定义环境变量(除了标准 Angular 提供的),您可以将上述服务添加到 App.module.ts

      export function init_app(appLoadService: EnvironmentService): () => Promise<any> {
        return () => appLoadService.init()
      }
      
      @NgModule({
        // ...
        providers: [
          EnvironmentService,
          { provide: APP_INITIALIZER, useFactory: init_app, deps: [ EnvironmentService ], multi: true },
        ],
        bootstrap: [ AppComponent ]
      })
      export class AppModule {
      }
      

      附:如有问题可以查看this one

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-06
      • 1970-01-01
      • 1970-01-01
      • 2016-10-14
      • 1970-01-01
      • 2021-05-05
      相关资源
      最近更新 更多