предисловие
существует«Практика прямой передачи файлов OSS (1): сервер»В этой статье объясняется, как создать сертификат прямой передачи на стороне сервера для прямой передачи OSS на стороне клиента.В этой статье объясняется общий процесс передачи файлов непосредственно в OSS на веб-странице с использованием платформы Angular. Использование функции загрузки в Angular немного сложнее, чем использование официально упакованного метода загрузки в апплете.
Получить проходной сертификат
Мы предполагаем, что API для получения сквозных учетных данных:
GET https://api.xxx.com/upload/token
Можно инкапсулировать процесс запроса сквозного сертификата (для удобства демонстрации все методы помещены вapp.component.ts
файл, методы, которые на самом деле включают HTTP-запросы, должны быть помещены в*.service.ts
файл):
// app.component.ts
import { HttpClient } from '@angular/common/http'
import { Component } from '@angular/core'
/** 直传凭证 */
export interface UploadToken {
key: string
policy: string
signature: string
OSSAccessKeyId: string
url: string
}
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
})
export class AppComponent {
constructor(private http: HttpClient) {}
token!: UploadToken
/** 获取直传凭证 */
getUploadToken() {
this.http.get('https://api.xxx.com/upload/token').subscribe((data: UploadToken) => {
this.token = data
})
}
}
Выберите файл
Относительно апплета можно использовать напрямуюwx.chooseMedia
Метод получает путь к ресурсу Путь для получения ресурса в Angular немного сложнее, вам нужно получить подкомпонент, используемый для загрузки файла в документ, а затем получить путь к файлу внутри него.
Сначала определите шаблон HTML.
// app.component.html
<input #uploader type="file" />
Это поле ввода для получения файла, где#uploader
Указывает имя шаблона, которое можно использовать в*.component.ts
файл, чтобы получить шаблон. Нужно использоватьViewChild
Декоратор получает шаблон.
import { HttpClient } from '@angular/common/http'
import { Component, ElementRef, ViewChild } from '@angular/core'
/** 直传凭证 */
export interface UploadToken {
key: string
policy: string
signature: string
OSSAccessKeyId: string
url: string
}
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
})
export class AppComponent {
constructor(private http: HttpClient) {}
@ViewChild('uploader')
FileElement!: ElementRef
token!: UploadToken
/** 获取直传凭证 */
getUploadToken() {
this.http.get('https://api.xxx.com/upload/token').subscribe((data: UploadToken) => {
this.token = data
})
}
/** 显示第一个文件的路径 */
showFile() {
console.log(this.FileElement.nativeElement.files[0])
}
}
Основная часть:
@ViewChild('uploader')
FileElement!: ElementRef
Среди них значение каждой части:
(1)'uploader'
а также<input #uploader type="file" />
серединаuploader
вести переписку.
(2)!
является ненулевым утверждением.
После нажатия связанной кнопки для выбора файла вызовитеshowFile
способ просмотра выбранного файла.
загрузить файлы
После получения файла и загрузки сертификата выполняется процесс загрузки. Здесь следует отметить, что при добавленииFormData
свойства, необходимоfile
элемент последним, в противном случае он не работает.
import { HttpClient } from '@angular/common/http'
import { Component, ElementRef, ViewChild } from '@angular/core'
/** 直传凭证 */
export interface UploadToken {
key: string
policy: string
signature: string
OSSAccessKeyId: string
url: string
}
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
})
export class AppComponent {
constructor(private http: HttpClient) {}
@ViewChild('uploader')
FileElement!: ElementRef
token!: UploadToken
/** 获取直传凭证 */
getUploadToken() {
this.http.get('https://api.xxx.com/upload/token').subscribe((data: UploadToken) => {
this.token = data
})
}
/** 显示第一个文件的路径 */
showFile() {
console.log(this.FileElement.nativeElement.files[0])
}
/** 直传至 OSS */
upload() {
const file = this.FileElement.nativeElement.files[0]
const formData = new FormData()
formData.append('OSSAccessKeyId', this.token.OSSAccessKeyId)
formData.append('key', this.token.key)
formData.append('policy', this.token.policy)
formData.append('signature', this.token.signature)
formData.append('file', file)
this.http.post(this.token.url, formData).subscribe((data: any) => {
// 打印最终的资源 URL 地址
console.log(this.token.url + '/' + this.token.key)
})
}
}