HarmonyOS 鸿蒙Next 怎样用axios上传相册中的图片
HarmonyOS 鸿蒙Next 怎样用axios上传相册中的图片 我用fileSelect()已经选择到了图片文件路径为file://media/Photo/1/IMG_1731313210_000/screenshot_20241111_161830.jpg,但是用axios提交这个图片地址上传的时候显示
error:{"message":"Failed to open/read local data from file/application","name":"AxiosError","stack":",如果上传的是沙箱中的地址则没问题,相册中的地址就不行,好像是没有权限取出?
//选择图片
async fileSelect() {
try {
// 设置图片选择器选项
const photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
// 限制只能选择一张图片
photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;
photoSelectOptions.maxSelectNumber = 1;
// 创建并实例化图片选择器
const photoViewPicker = new photoAccessHelper.PhotoViewPicker();
// 选择图片并获取图片URI
let uris: photoAccessHelper.PhotoSelectResult = await photoViewPicker.select(photoSelectOptions);
if (!uris || uris.photoUris.length === 0) return;
// 获取选中图片的第一张URI
let uri: string = uris.photoUris[0];
console.log(uri.toString())
this.img=uri;
} catch (e) {
console.error('openPicker', JSON.stringify(e));
}
}
//上传图片
upload(){
let formData = new FormData()
formData.append('img', 'internal://cache/'+this.img)
axios.post<string, AxiosResponse<string>, FormData>(Global.SERVER+'/getfankui.aspx?type=1'+ Global.OtherURL, formData, {
headers: { 'Content-Type': 'multipart/form-data' },
context: getContext(this),
onUploadProgress: (progressEvent: AxiosProgressEvent): void => {
console.info(progressEvent && progressEvent.loaded && progressEvent.total ? Math.ceil(progressEvent.loaded / progressEvent.total * 100) + '%' : '0%');
},
}).then((res: AxiosResponse<string>) => {
console.info("result" + JSON.stringify(res.data));
}).catch((err: AxiosError) => {
console.error("error:" + JSON.stringify(err));
})
}
更多关于HarmonyOS 鸿蒙Next 怎样用axios上传相册中的图片的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
可以将select获取到的文件通过复制转换为沙箱路径,再上传即可,示例如下
import fs from '@ohos.file.fs';
import photoAccessHelper from '@ohos.file.photoAccessHelper';
@Entry
@Component
export struct Index {
picture() {
let PhotoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
PhotoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;
PhotoSelectOptions.maxSelectNumber = 1;
let photoPicker = new photoAccessHelper.PhotoViewPicker();
photoPicker.select(PhotoSelectOptions).then((PhotoSelectResult: photoAccessHelper.PhotoSelectResult) => {
let photouri: Array<string> = PhotoSelectResult.photoUris
let file = fs.openSync(photouri[0], fs.OpenMode.READ_ONLY)
let pathDir = getContext().filesDir;
let file2 = fs.openSync(pathDir + '/picture2.jpg', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)
fs.copyFileSync(file.fd, file2.fd)//先创建有读写权限的文件,再把不可读写的文件复制过来
//通过沙箱路径文件file2上传
fs.closeSync(file);
fs.closeSync(file2);
})
}
build() {
Column() {
Button('选择图片').onClick(() => {
this.picture()
})
}
}
}
更多关于HarmonyOS 鸿蒙Next 怎样用axios上传相册中的图片的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
兄嘚
你是把这个file2转成ArrayBuffer或者uri再上传的吗
还有点不太清楚咋回事都,
还需要申请读取写入的权限吗,
相册的图片先存到沙盒,再去上传
在HarmonyOS鸿蒙Next系统中,若要使用axios上传相册中的图片,你需要先确保你的应用拥有访问相册的权限,并且能够选择并获取图片文件的路径。接下来,你可以通过以下步骤实现图片的上传:
-
获取图片文件:使用HarmonyOS的文件选择器API让用户从相册中选择图片,并获取其文件路径。
-
读取图片文件:利用HarmonyOS的文件读取API,将图片文件转换为Base64编码或直接读取为二进制数据。
-
使用axios上传:配置axios请求,将图片数据作为请求体的一部分发送至服务器。这通常涉及设置正确的
Content-Type
(如multipart/form-data
)并在请求体中附加图片数据。 -
处理响应:服务器接收到图片后,会返回相应的响应。在你的应用中处理这个响应,比如显示上传成功或失败的信息。
请注意,由于HarmonyOS的API可能与Android或iOS有所不同,你需要参考HarmonyOS的官方文档来具体实现上述步骤。
如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html