我正在为一个phonegap构建应用程序托管我的网页。 我想使用相机上传照片,并显示预览图片,基本上是这样做的:
<img src="file:///storage/emulated/0/Android/data/com.myapp.myapp/cache/1470418568917.jpg" height="500" />
由于我的网页已托管,因此收到此错误:
不允许加载本地资源:file:///storage/emulated/0/Android/data/com.myapp.myapp/cache/1470418568917.jpg" ;, source:https://www.myapp.com/v5.5/imager.html#
我认为这是一些CORS问题,所以我已将此添加到页面的html
<meta http-equiv="Content-Security-Policy" content="default-src *; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'; media-src *; img-src * filesystem: data:">
这是我的config.xml(我使用的是Phonegap Build)
<plugin name="cordova-plugin-whitelist" source="npm" />
<allow-navigation href="*" />
<allow-navigation href="*://*/*" />
<allow-navigation href="file:///*/*" />
<allow-navigation href="http://*/*" />
<allow-navigation href="https://*/*" />
<allow-navigation href="data:*" />
<allow-intent href="*" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
<access origin="*" />
<access origin="*://*/*" />
<access origin="file:///*" />
<access origin="cdvfile://*" />
<access origin="content:///*" />
正如你所看到的,我已经尝试过每一个我能想到的设置,从网上搜索。 我错过了一些明显的东西吗?
提前致谢。
答案 0 :(得分:12)
确定终于得到了一个解决方法,即将file:/// URI转换为cdvfile:// URI,我的页面只是抱怨的是混合内容警告,并允许我访问!
function getFileEntry(imgUri) {
window.resolveLocalFileSystemURL(imgUri, function success(fileEntry) {
console.log("got file: " + fileEntry.fullPath);
console.log('cdvfile URI: ' + fileEntry.toInternalURL());
$('#imgPreview').attr("src", fileEntry.toInternalURL());
});
}
使用正确的方法来访问file:/// URI仍然会很高兴,我可以看到这种情况不起作用的情况,但是我正在解决这个问题。
答案 1 :(得分:12)
此处需要注意的是遇到此问题的未来用户,请确保在测试此类功能时,您未在“实时重新加载”模式下运行。 Live Reload将导致同样的错误消息,这显然具有误导性。在使用以下文件构建w / o实时重新加载后,一切正常:/或cdv:/ path。
答案 2 :(得分:8)
我最近遇到了同样的问题。看来cordova ios应用程序在localhost:8080内部运行,这是它不允许从&#34; file://&#34;加载文件的主要原因。协议
简单修复 - &#34; var workingPath = window.Ionic.normalizeURL(givenPath)&#34;;
请阅读IONIC关于该文章的文章 - https://ionicframework.com/docs/wkwebview/
答案 3 :(得分:1)
这与ionic 3配合使用,您可以在下面使用它来解决“不允许加载本地资源”的问题
首先将这些东西放入home.ts
import { Base64 } from '@ionic-native/base64';
import { DomSanitizer, SafeResourceUrl, SafeUrl } from
'@angular/platform-browser';
//inside the export class
base64Image:any;
croppedImage = null;
constructor(
public base64:Base64,
public domSanitizer:DomSanitizer,
) {}
selectImage() {
const options: CameraOptions = {
quality: 100,
destinationType: this.camera.DestinationType.FILE_URI,
encodingType: this.camera.EncodingType.JPEG,
mediaType: this.camera.MediaType.PICTURE,
correctOrientation: true,
sourceType:0,
}
this.croppedImage = null;
this.camera.getPicture(options).then((imageData) => {
this.croppedImage = imageData;
this.crop.crop(this.croppedImage, {quality: 100,targetWidth: -1, targetHeight:
-1 })
.then(
newImage => {
this.base64.encodeFile(newImage).then((base64File: string) => {
let imageSrc = base64File.split(",");
this.base64Image = 'data:image/jpeg;base64,' + imageSrc[1];
this.croppedImage =
this.domSanitizer.bypassSecurityTrustUrl('data:image/jpeg;base64,' +
imageSrc[1]);
}, (err) => {
console.log(err);
});
console.log('new image path is: ' + newImage);
},
error => {
console.error('Error cropping image', error);
}
);
// this.myImage = 'data:image/jpeg;base64,' + imageData;
});
}
然后在home.html视图中将东西放在下面
<button ion-button full (click)="selectImage()"
*ngIf="!base64Image">Gallery</button>
<button ion-button full (click)="selectImageFromCamera()">Camera</button>
<ion-row *ngIf="croppedImage">
<ion-card>
<ion-card-header>Cropped Image</ion-card-header>
<ion-card-content padding>
<img [src]="croppedImage">
</ion-card-content>
</ion-card>
</ion-row>`enter code here`
答案 4 :(得分:1)
@Vladyslav Goloshchapov的答案是针对我的情况的正确答案(使用不建议使用的表格)。
我正在尝试使用phonegap-plugin-contentsync在Ionic应用程序(均为Ionic 4)中打开Ionic应用程序,这允许您将文件(在我的情况下为Ionic应用程序)下载并解压缩到本地文件系统中。 (第二个应用不是已发布的应用。)
我将其用作:window.location.href = window.Ionic.WebView.convertFileSrc(url);
(对于iOS)。
Android并不复杂,因此您可以使用window.open(url, '_self');
我的URL格式为(对于iOS):file:///var/mobile/Containers/Data/Application/[UUID]/Library/NoCloud/[appFolder]/index.html
答案 5 :(得分:0)
我正在使用ionic3应用程序并使用 chrome检查器测试控制台。我还在运行并使用 - livereload 标志进行模拟,它没有显示图像在模拟器上或在真实设备上。
我转到Above mentioned link并从&#39; ionic-angular&#39 ;; 中导入模块 import {normalizeURL}
关于我的图像捕捉功能的成功回调,我通过了这样的路径,它就像一个魅力
在稍微调查一下之后,我发现它是因为 - livereload Flag ,我从命令中删除了标志,使用以下命令运行程序并立即显示图像:
离子cordova运行android
takePhoto() {
this.camera.getPicture(this.getCameraOptions()).then((imageData) => {
this.isPhotoTaken = true;
this.photo = normalizeURL(imageData);
console.log("PHOTO PATH: "+ this.photo)
}, (err) => {
console.error('IMAGE CAPTURE ERROR: ' + err);
});
}
setCameraOptions() {
const options = {
quality: 100,
sourceType: this.camera.PictureSourceType.CAMERA,
saveToPhotoAlbum: false,
correctOrientation: true
};
return options;
}
getCameraOptions(): CameraOptions{
return this.setCameraOptions();
}
答案 6 :(得分:0)
我的解决方案是从插件列表中删除cordova-plugin-ionic-webview
答案 7 :(得分:0)
这是唯一对我有用的东西: window ['Ionic'] ['WebView']。convertFileSrc(yourURL);
答案 8 :(得分:0)
Ionic 4-5 用户请注意。不允许 Webview 从存储中读取。通过使用该方法图像被加载为本地主机资源。从设备获取只是 url 被操纵。
在 .html 中
std
在 .ts 中
<img [src]="getTrustImg(imageSrc)" />