在我的Ionic项目中,我正在使用Capacitor在移动平台中进行部署。
为了从设备捕获图像,我正在使用电容器相机,它可以帮助我以三种格式获取图像。1. Base64。2. DataUrl。3. FileUri。
onCaptureImage() {
if (!Capacitor.isPluginAvailable('Camera')) {
this._sharedService.showToastMessage(
'Unable To Open Camera', 1000);
return;
}
Plugins.Camera.getPhoto({
quality: 60,
source: CameraSource.Prompt,
correctOrientation: true,
resultType: CameraResultType.DataUrl
})
.then(image => {
const blobImg = this._sharedService.dataURItoBlob(image.dataUrl);
this.myfiles.push(blobImg);
this.urls.push(this.sanitizer.bypassSecurityTrustUrl(image.dataUrl));
})
.catch(error => {
return false;
});
}
从此DataUrl
中我用来显示图像并上传该图像,我将其转换为Blob
,然后通过FormData
发送。
现在质量是60,我希望质量是100。但是当我们从100个质量图像中生成DataUrl
时,它挂起了设备。
[我只想知道有什么方法可以生成质量为100的FileUri
,也可以预览图像而无需从中生成Base64
或DataUrl
。
谢谢。
巨大的base64字符串的大小是应用程序挂起的原因。看看这个解决方案...
如下使用相机设置:
Camera.getPhoto({
quality: 100,
resultType: CameraResultType.Uri,
source: CameraSource.Prompt
}).then((image) => {
//imgSrc is passed to src of img tag
imgSrc = this.domSanitizer.bypassSecurityTrustResourceUrl(image && (image.webPath));
// image.path is what you will have to send to the uploadPhoto method as uripath
});
Uri格式将为您提供本地文件路径,可以轻松地将其传递到文件传输插件... image.path是摄像机返回的本地文件路径。.
用于将文件传输到服务器,您将需要cordova文件传输插件。代码将如下所示。
import { FileTransfer, FileUploadOptions, FileTransferObject } from '@ionic-native/file-transfer/ngx';
constructor(private transfer: FileTransfer)
uploadPhoto(fileName:string, uripath:string):Promise<any>{
return new Promise((resolve,reject) => {
const fileTransfer: FileTransferObject = this.transfer.create();
const options: FileUploadOptions = {
fileKey: 'file',
fileName: fileName,
mimeType: 'image/jpg',
chunkedMode: false,
params: {
//any params that you want to attach for the server to use
},
headers: {
//any specific headers go here
}
};
fileTransfer.upload(uripath, <APIEndpointURL>, options)
.then((result) => {
// success
resolve(result);
}, (err) => {
// error
reject(err);
});
});
}
使用此方法,无论图像质量如何,您的服务器都将肯定会接收文件。我在node.js和php服务器上都使用了此方法。