javascript - Angular2 中的文件上传不起作用

标签 javascript c# angular file-upload .net-core

我正在尝试创建一个文件上传功能,用户可以在其中上传geotiff(大小可能有几GB)。 由于某种原因,我的 Angular 代码无法访问 api 并抛出 404,但我可以使用 Postman 上传文件。

Angular 代码:

 fileChange(event) {
        let token = localStorage.getItem('userToken');
        let fileList: FileList = event.target.files;
        if (fileList.length > 0) {
            let file: File = fileList[0];
            let formData: FormData = new FormData();
            formData.append('files', file, file.name);
            let headers = new Headers();
            headers.append('Content-Type', 'multipart/form-data');
            headers.append("Authorization", token);
            let options = new RequestOptions({ headers: headers });
            this.uploadInProgress = true;
            this._http.post(`${this.uploadApiUrl}`, formData, options)
                .map(res => res.json())
                .catch(error => Observable.throw(error))
                .subscribe(
                data => console.log('success'),
                error => console.log(error),
                () => this.uploadInProgress = false)
        }
    }

API:

// POST: api/GeoTif
[HttpPost]
public async Task<IActionResult> Post(List<IFormFile> files)
        {
            long size = files.Sum(f => f.Length);


            return Ok(new { NoOfUploadedFileCount = files.Count, TotalFileSize =size });
        }

最佳答案

我了解到 HTTP 服务和 FormData 存在问题。您可以使用 XMLHttpRequest 来完成它:

fileChange(event: Event) {
    this.uploadFile(event)
        .subscribe(() => {
            console.log('sent');
        })
}

private uploadFile(event: Event) {
    return Observable.create(observer => {
        const token = localStorage.getItem('userToken');
        const fileList = event.target.files;
        if (fileList.length > 0) {
            const file = fileList[0];
            const formData = new FormData();
            const xhr = new XMLHttpRequest();

            formData.append('files', file, file.name);
            this.uploadInProgress = true;
            xhr.onreadystatechange = () => {
                if (xhr.readyState === 4) {
                    if (xhr.status === 200) {
                        observer.next(JSON.parse(xhr.response));
                        observer.complete();
                    } else {
                        observer.error(xhr.response);
                    }
                    this.uploadInProgress = false;
                }
            }

            xhr.open('POST', this.uploadApiUrl, true);
            xhr.send(formData);
        }
    });
}

关于javascript - Angular2 中的文件上传不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43672903/

相关文章:

javascript - 使用jwplayer检测视频结束?

Javascript正则表达式函数 "test"在内部js中工作但在外部js文件中不起作用

c# - 使用 WindowsCredentials 连接到 TfsTeamProjectCollection

angular - 如何使用 Karma 配置在 Angular 4 中排除用于单元测试的文件夹(组件)?

angular - HTTP 使用 firebase Id_token 从 API 获取 Angular 4

javascript - 为什么 React 渲染的 "h1"元素中的 class 属性消失了?

javascript - SQL 与 Sequelize : Compare json columns using where

c# - 如何使用 C# 编写 LINQ 查询以从另一个对象获取对象?

c# - 使用来自非泛型类的泛型

angular - 覆盖导入模块的组件声明