вам на самом деле нужны 4 Ionic
Cordova
плагины для загрузки файла после получения всех метаданных файла.
- FileChooser
Открывает средство выбора файлов на Android для пользователя, чтобы выбрать файл, возвращает URI файла.
FilePath
Этот плагин позволяет разрешать собственный путь к файловой системе для URI контента Android и основан на коде из библиотеки aFileChooser.
Файл
Этот плагин реализует File API, позволяющий доступ на чтение / запись к файлам, находящимся на устройстве.
Файл Трнафер
Этот плагин позволяет загружать и скачивать файлы.
получение метаданных файла.
file.resolveLocalFilesystemUrl
с fileEntry.file
предоставит вам все необходимые метаданные, кроме имени файла . В метаданных есть свойство, которое называется name
, но оно всегда содержит значение content .
- Чтобы получить понятное для человека имя файла, вам нужно
filePath
. Но помните, что вы не можете использовать возвращаемый путь к файлу для получения метаданных. Для этого вам понадобится исходный URL от fileChooser
.
filePathUrl.substring(filePathUrl.lastIndexOf('/') + 1)
используется для получения только имени файла из filePath
.
- Вам нужно
nativeURL
файла, чтобы загрузить его. Использование пути к файлу, возвращающегося из filePath
, не будет работать.
getFileInfo(): Promise<any> {
return this.fileChooser.open().then(fileURI => {
return this.filePath.resolveNativePath(fileURI).then(filePathUrl => {
return this.file
.resolveLocalFilesystemUrl(fileURI)
.then((fileEntry: any) => {
return new Promise((resolve, reject) => {
fileEntry.file(
meta =>
resolve({
nativeURL: fileEntry.nativeURL,
fileNameFromPath: filePathUrl.substring(filePathUrl.lastIndexOf('/') + 1),
...meta,
}),
error => reject(error)
);
});
});
});
});
}
выберите файл в файловой системе мобильного телефона.
async selectAFile() {
this.getFileInfo()
.then(async fileMeta => {
//get the upload
const uploadUrl = await this.getUploadUrl(fileMeta);
const response: Promise < any > = this.uploadFile(
fileMeta,
uploadUrl
);
response
.then(function(success) {
//upload success message
})
.catch(function(error) {
//upload error message
});
})
.catch(error => {
//something wrong with getting file infomation
});
}
загрузка выбранного файла.
Это зависит от вашей серверной реализации. Это как использовать File Transfer для загрузки файла.
uploadFile(fileMeta, uploadUrl) {
const options: FileUploadOptions = {
fileKey: 'file',
fileName: fileMeta.fileNameFromPath,
headers: {
'Content-Length': fileMeta.size,
'Content-Type': fileMeta.type,
},
httpMethod: 'PUT',
mimeType: fileMeta.type,
};
const fileTransfer: FileTransferObject = this.transfer.create();
return fileTransfer.upload(file.path, uploadUrl, options);
}
надеюсь, это поможет. :)