这段时间一直在各种 Angular 项目中挣扎,特别是上传让人措手不及。 索性直接编写一篇可以快速上手的实例,直接抄或者仿照都应该可以直接使用。
- 新建一个服务
$ng g s UploadService
- 对服务添加依赖
// http angular的标准HTTP服务
constructor(private http: HttpClient) {}
// 增加上传方法,参数暂时只有 file
upload(file: File) {
// 构建合适的数据表单
const formData = new FormData();
formData.append('file', file);
// 构建请求体,因为要做上传进度,所以设置了 reportProgress 为真
const req = new HttpRequest('POST', '/upload/file/path', formData, {
reportProgress: true
});
// 上传重试两次,用了 rxjs 的操作
return this.http.request(req).pipe(retry(2));
}
- 在 Component 增加上传的操作函数
uploadButtonClicked(ev) {
// 这里走的是模拟方法
const elm = document.createElement('input');
elm.type = 'file';
elm.multiple = false; // 每次仅上传一个文件,所以直接设置为假
// 监听改变
elm.addEventListener('change', () => {
if (elm.files.length > 0) {
const file = elm.files[0];
this.uploadService
.upload(file)
.subscribe((event) => {
switch (event.type) {
case HttpEventType.Sent:
console.info(`${file.name} 上传完毕`);
break;
case HttpEventType.UploadProgress:
const percentDone = Math.round(100 * event.loaded / event.total);
console.info(`${file.name} 上传进度: ${percentDone}%`)
break;
case HttpEventType.Response:
console.info(`远程有返回`)
break;
default:
this.logger.info(`"${file.name}" 其他状态: ${event.type}`);
}
});
}
});
elm.click();
}