在安卓App内嵌vue项目中,vue中使用了plus.gallery.pick,然后返回的是contenturi内容,然后使用了plus.io.resolveLocalFileSystemURL显示地址无效,现在无法上传图片给后端,如何在vue项目中进行修改
参考GPT和自己的思路:在安卓App内嵌Vue项目中使用plus.gallery.pick获取到的是contenturi,而plus.io.resolveLocalFileSystemURL无法解析contenturi,这是因为contenturi不是一个本地的文件路径,而是一个指向Android系统中MediaStore的一个资源地址。
为了解决这个问题,可以使用cordova-plugin-filepath插件来处理contenturi,该插件可以将contenturi转换为本地文件路径。以下是安装和使用cordova-plugin-filepath插件的步骤:
安装cordova-plugin-filepath插件
cordova plugin add cordova-plugin-filepath
在Vue项目中使用该插件
// 引入 cordova-plugin-filepath 插件
import FilePath from 'cordova-plugin-filepath';
// 使用 FilePath.resolveNativePath 方法将 content uri 转换为本地文件路径
FilePath.resolveNativePath(uri, (filePath) => {
console.log('本地文件路径:', filePath);
});
使用以上方法可以将contenturi转换为本地文件路径,然后就可以将本地文件路径上传给后端了。
参考GPT和自己的思路,针对你提到的问题,可以尝试以下步骤来解决:
1.获取 content uri 对应的实际文件路径。
在 Android 平台上,content uri 可能需要使用 ContentResolver.query 方法查询获取对应的实际文件路径。可以通过如下代码来实现:
const filePath = new Promise(resolve => {
const contentResolver = plus.android.runtimeMainActivity().getContentResolver()
const cursor = contentResolver.query(contentUri, null, null, null, null)
cursor.moveToFirst()
const columnIndex = cursor.getColumnIndex("_data")
const path = cursor.getString(columnIndex)
cursor.close()
resolve(path)
})
2.使用获取到的实际文件路径进行文件上传。
在获取到实际文件路径后,可以使用类似 Axios 这样的库进行文件上传,例如:
const formData = new FormData()
const file = new File([new Blob([await fetch(filePath).then(res => res.blob())])], 'filename.png')
formData.append('file', file)
axios.post('/upload', formData, { headers: { 'Content-Type': 'multipart/form-data' } })
.then(response => {
// 处理上传成功的逻辑
})
.catch(error => {
// 处理上传失败的逻辑
})
注意,在 Android 平台上,由于涉及到文件读写权限,可能需要在 AndroidManifest.xml 文件中添加对应的权限声明,例如:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
希望以上步骤对你有所帮助。
针对你的问题,我建议你可以在plus.io.resolveLocalFileSystemURL中使用文件的真实路径而不是URI类型的内容,这样就能够正确地访问到文件了。你可以通过调用Android平台相关API或使用cordova-plugin-filepath插件获取文件的真实路径。
具体来说,你可以按照以下步骤进行修改:
在Vue项目中安装cordova-plugin-filepath插件,具体可以参考插件官方文档。
调用plus.gallery.pick函数选择图片,并获取到URI类型的数据。
使用cordova-plugin-filepath插件的相关API,将URI类型的数据转换成真实路径。
将真实路径传递给plus.io.resolveLocalFileSystemURL函数,进行文件操作。
以下是一个示例代码片段,供你参考:
// 调用plus.gallery.pick函数选择图片
plus.gallery.pick(function(e) {
// 获取URI类型的数据
var uri = e.files[0];
// 使用cordova-plugin-filepath插件将URI类型的数据转换成真实路径
window.FilePath.resolveNativePath(uri, function(filePath) {
// 将真实路径传递给plus.io.resolveLocalFileSystemURL函数
plus.io.resolveLocalFileSystemURL(filePath, function(entry) {
// entry就是文件操作对象,可以进行上传操作等等
});
}, function(error) {
// 处理错误信息
});
}, function(error) {
// 处理错误信息
}, {filter: 'image'});
function galleryImg() {
plus.gallery.pick(function(a) {
plus.io.resolveLocalFileSystemURL(a, function(entry) {
plus.io.resolveLocalFileSystemURL("_doc/", function(root) {
root.getFile("head.jpg", {}, function(file) {
//文件已存在
file.remove(function() {
//console.log("file remove success");
entry.copyTo(root, 'head.jpg', function(e) {
var e = e.fullPath + "?version=" + new Date().getTime();
xianshivideo(); //显示视频
document.getElementById("head-img1").src = e;
//变更大图预览的src
//目前仅有一张图片,暂时如此处理,后续需要通过标准组件实现
document.querySelector("#__mui-imageview__group .mui-slider-item img").src = e + "?version=" + new Date().getTime();
},
function(e) {
console.log('copy image fail:' + e.message);
});
}, function() {
console.log("delete image fail:" + e.message);
});
}, function() {
//文件不存在
entry.copyTo(root, 'head.jpg', function(e) {
var path = e.fullPath + "?version=" + new Date().getTime();
xianshivideo(); //显示视频
document.getElementById("head-img1").src = path;
//变更大图预览的src
//目前仅有一张图片,暂时如此处理,后续需要通过标准组件实现
document.querySelector("#__mui-imageview__group .mui-slider-item img").src = path;
},
function(e) {
console.log('copy image fail:' + e.message);
});
});
}, function(e) {
console.log("get _www folder fail");
})
}, function(e) {
console.log("读取拍照文件错误:" + e.message);
});
}, function(a) {}, {
filter: "image" // **_这个类型对吗_**
})
};
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
问题分析:
根据你的问题描述,你在安卓App内嵌的vue项目中,使用了plus.gallery.pick,从相册中选择图片后返回contenturi内容,但是使用了plus.io.resolveLocalFileSystemURL方法无法显示地址,导致无法上传图片给后端。原因可能是因为获取的contenturi是Android特有的Uri格式,需要进行转换。
解决办法:
可以尝试使用cordova-plugin-file插件来进行获取本地文件路径的操作。
步骤:
cordova plugin add cordova-plugin-file
plus.gallery.pick(function(path) {
plus.io.resolveLocalFileSystemURL(path, function(entry) {
var localPath = entry.toLocalURL();
// 上传图片给后端
uploadImage(localPath);
});
});
示例代码:
```
var uploadImage = function(localPath) {
// 调用上传图片接口,上传图片给后端
// 示例代码
var serverUrl = "http://x/
在将Vue项目嵌入Android App中,您可以使用WebView来加载Vue的index.html文件。下面是一个基本的步骤:
使用Vue-CLI创建一个Vue项目,并使用npm run build命令进行构建。
将构建后的dist文件夹中的所有内容复制到Android应用程序的资源目录中。
在Android应用程序中使用WebView控件来加载Vue的index.html文件,可以使用以下步骤来创建WebView:
(1)通过XML文件添加一个WebView控件
(2)在Java代码中获取WebView并加载URL
WebView webView = (WebView) findViewById(R.id.webview);
webView.loadUrl("file:///android_asset/dist/index.html");
这里的loadUrl()方法指定设置WebView打开的URL是加载本地的index.html文件。
默认情况下,WebView不允许执行JavaScript代码。可以通过以下方式启用它:
webView.getSettings().setJavaScriptEnabled(true);
要处理运行过程中在WebView中可能出现的错误,可以注册一个WebViewClient并重写必要的方法来处理错误。
由于Android允许应用程序访问Internet,因此Vue应用程序中发送的HTTP请求也可以在Android应用程序中正常工作。
以上是将Vue项目内嵌到Android应用程序中的基本步骤,您可以根据实际需要做更多的修改和优化。
不知道你这个问题是否已经解决, 如果还没有解决的话:地址无效,说明你的地址不是服务器的地址,而是本地文件开头的,需要http开头的那个地址