鸿蒙从相册选择图片上传到服务器
01.从相册选择图片
创建图片选择对象并选择图片,new picker.PhotoViewPicker() 它的实例化对象中有一个select方法,里面需要传规定上传文件类型数量的参数,它的返回的是一个promise。
这个参数需要通过 new picker.PhotoSelectOptions() ,实例化对象中有两个值,一个是规定文件类型的,一个是规定文件数量的。
import picker from '@ohos.file.picker';
async pickerAvatar(){
const optinos = new picker.PhotoSelectOptions()
//规定为图片类型
optinos.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE
//上传文件数量
optinos.maxSelectNumber = 1
//通过picker的实例化对象中的select自动获取用户选择的那张图片的地址
const pickerView = new picker.PhotoViewPicker()
//optinos 规定用户选择的文件类型和数量
let urls = await pickerView.select(optinos)
//判断用户是否选择了图片
if(urls.photoUris.length<=0){
return
}
//有图片就返回图片地址
let imgUrl = urls.photoUris[0]
return imgUrl
}
02.拷贝图片到缓存目录
需要根据原地址获取内存地址是一个数字
01.第一个参数是原地址 第二个参数是规定文件是否是可读可写的
const file = fs.openSync(photoImagePath, fs.OpenMode.READ_ONLY)
let fileFD = file.fd
02.获取需要拷贝到的目标地址
//根据上下文获取文件夹目录
let destPath = getContext().cacheDir
//生成一个文件的名字
let fileName = Date.now().toString()
//生成一个文件的后缀
const ext = 'jpg'
//合成一个完整的路径
let fullPath = destPath + '/' + fileName + '.' + ext
03.把图片拷贝的到缓存目录
fs.copyFileSync(fileFD, fullPath)
完整代码
import fs from '@ohos.file.fs';
async copyImageToCache(photoImgPath:string){
//根据原地址获取其文件的内存地址,是一个数字
const file = fs.openSync(photoImgPath,fs.OpenMode.READ_ONLY)
let fileFD = file.fd
//获取需要拷贝到的目标地址
let destPath = getContext().cacheDir
//随机生成一个文件名
let fileName = Date.now().toString()
//固定一个文件的拓展名
const ext = 'jpg'
//把他组合成一个完成文件名
let fullPath = destPath+'/'+fileName+'.'+ext
fs.copyFileSync(fileFD,fullPath)
//返回缓存目录的地址
return [`internal://cache/${fileName + '.' + ext}`,fileName + '.' + ext]
}
03.发送请求上传图片
需要调用 request.uploadFile 里面2个参数,第一个参数getContext(),第二个参数一个对象里面放请求的相关参数 请求类型,请求地址,请求头信息,files和data
files:是一个数组对象 对象里面有四个值 第一个是文件名字,文件类型,name看接口文档给什么就填什么,文件的完整地址
data:是额外要提交的数据不能省略
async uploadAvatar(arr:string[]){
//调用上传方法
let uploador = await request.uploadFile(getContext(),{
method:'POST',
url:'请求路径',
header:{
'请求头相关参数'
},
files:[{filename:arr[1],type:'jpg',name:'file',uri:arr[0]}],
data:[]
})
uploador.on('progress',(uploadedSize,totleSize)=>{
if(uploadedSize === totleSize){
AlertDialog.show({message:'上传完成'})
}
})
}

43

被折叠的 条评论
为什么被折叠?



