媒介
在手机APP中,图片上传功能为用户提供了便捷的方式来分享和通报视觉信息。无论是在社交媒体上分享旅行照片、美食体验,还是在工作场合中提交项目进展报告、展示设计结果,用户都能通过图片上传功能轻松实现。这一功能的实现,不仅满意了用户对于信息分享和通报的需求,还使用户可以更加直观地表达自己的想法和感受,与他人举行更加丰富的交流。
实现步调
在鸿蒙系统中,图片上传功能通过简朴三步即可完成:首先选择图片,随后将图片拷贝至缓存目次,最后实行上传操作。接下来就让我们一起来看看详细如何实现的吧。
选择相册图片
因为选择图片需要用到 picker,接下来让简朴先容一下Picker。
选择器(Picker)是一个封装PhotoViewPicker、DocumentViewPicker、AudioViewPicker等API模块,具有选择与生存的本领。应用可以自行选择使用哪种API实现文件选择和文件生存的功能。此中我们主要使用的是PhotoViewPicker。
PhotoViewPicker(图库选择器对象),用来支持选择图片/视频和生存图片/视频等用户场景。
更多的详情请参考选择用户文件 (openharmony.cn)
详细的实现逻辑如下:
- import picker from '@ohos.file.picker';
- // 一、定义图片选择 Picker 的配置
- // 实例化 选项对象
- const photoSelectOptions = new picker.PhotoSelectOptions();
- // 过滤选择媒体文件类型为IMAGE
- photoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE;
- // 选择媒体文件的最大数目
- photoSelectOptions.maxSelectNumber = 1;
- // 二、创建 图片选择对象并选择图片
- const photoViewPicker = new picker.PhotoViewPicker();
- // 调用 select 方法,传入选项对象
- photoViewPicker.select(photoSelectOptions).then(res=>{
- const uri = res.photoUris[0]
- // 因为只选了一张
- AlertDialog.show({ message: '图片路径为:' + uri })
- })
复制代码
拷贝图片到缓存目次
当前上传应用文件功能,不支持直接上传当地相册的文件,仅支持上传应用缓存文件路径(cacheDir)下的文件。
在使用上传功能前,需要先申请权限,即在module.json5设置文件的requestPermissionsrequestPermissions标签中声明权限。
- "requestPermissions":[
- {
- "name" : "ohos.permission.INTERNET",
- "reason": "$string:reason",
- "usedScene": {
- "abilities": [
- "FormAbility"
- ],
- "when":"inuse"
- }
- }
- ]
复制代码 接下来使用 fs 模块将上一步的文件,拷贝到 cacheDir 目次下。
fs模块为基础文件操作API,提供基础文件操作本领,包括文件基本管理、文件目次管理、文件信息统计、文件流式读写等常用功能。
更多的详情请参考@ohos.file.fs (文件管理) (openharmony.cn)
- import fs from '@ohos.file.fs';
- // 三.将文件保存到缓存目录(只能上传在缓存目录中的文件)
- const context = getContext(this)
- const fileType = 'jpg'
- // 生成一个新的文件名
- const fileName = Date.now() + '.' + fileType
- // 通过缓存路径+文件名 拼接出完整的路径
- const copyFilePath = context.cacheDir + '/' + fileName
- // 将文件 拷贝到 临时目录
- const file = fs.openSync(uri, fs.OpenMode.READ_ONLY)
- fs.copyFileSync(file.fd, copyFilePath)
复制代码
上传文件
预备好参数调用request.uploadFile()得到上传对象 uploader
给uploader对象注册progress事件,监听上传进度 requestRes.on("progress", (uploadedSize: number, totalSize: number)=>{})
- import request from '@ohos.request';
- import http from '@ohos.net.http';
- // 四、上传图片
- // 上传文件
- let files: Array<request.File> = [
- // internal://cache/ 固定的
- { filename: fileName, type: fileType, name: 'img', uri: `internal://cache/${fileName}` }
- ]
- request.uploadFile(context, {
- url: '接口地址', // url 地址
- method: 请求方法, // 请求方法
- header: {
- // 和接口文档的要求的格式对象
- contentType: '',
- },
- files, // 文件信息
- data: [] // 额外提交的数据,不能省略
- })
- .then((res => {
- //获取到响应的内容
- res.on('headerReceive', (value) => {
- // 根据接口文档 转为对应的类型即可
- const uploadRes = (value as UploadResponse)
- const response = JSON.parse(uploadRes.body) as Response
- AlertDialog.show({
- message: response.data.url
- })
- console.log('上传的地址为:', response.data.url)
- })
- }))
复制代码
完备代码
- import picker from '@ohos.file.picker';
- import fs from '@ohos.file.fs';
- import request from '@ohos.request';
- import http from '@ohos.net.http';
- // 定义类型
- interface UploadResponse {
- body: string
- }
- export interface Response {
- /**
- * 业务状态码
- */
- code: number;
- /**
- * 响应数据
- */
- data: Data;
- /**
- * 响应消息
- */
- message: string;
- }
- /**
- * 响应数据
- */
- export interface Data {
- /**
- * 上传成功的图片-在线地址
- */
- url: string;
- }
- // 实例化 选项对象
- const photoSelectOptions = new picker.PhotoSelectOptions();
- // 过滤选择媒体文件类型为IMAGE
- photoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE;
- // 选择媒体文件的最大数目
- photoSelectOptions.maxSelectNumber = 1;
- @Entry
- @Component
- struct Page03_uploadImg {
-
- @State img :string =''
-
- build() {
- Navigation() {
- Column() {
- Image(this.img)
- Button('选择并上传图片')
- .onClick(() => {
- // 创建 图片选择对象
- const photoViewPicker = new picker.PhotoViewPicker();
- // 调用 select 方法,传入选项对象
- photoViewPicker.select(photoSelectOptions)
- .then(res => {
- const uri = res.photoUris[0]
- // 因为只选了一张
- // AlertDialog.show({ message: '图片路径为:' + uri })
- // 三、拷贝文件到缓存目录
- // 将文件保存到缓存目录(只能上传在缓存目录中的文件)
- const context = getContext(this)
- const fileType = 'jpg'
- // 生成一个新的文件名
- const fileName = Date.now() + '.' + fileType
- // 通过缓存路径+文件名 拼接出完整的路径
- const copyFilePath = context.cacheDir + '/' + fileName
- // 将文件 拷贝到 临时目录
- const file = fs.openSync(uri, fs.OpenMode.READ_ONLY)
- fs.copyFileSync(file.fd, copyFilePath)
- // 四、上传图片
- // 上传文件
- let files: Array<request.File> = [
- // internal://cache/ 固定的
- // name 和接口文档的要求对上
- { filename: fileName, type: fileType, name: 'img', uri: `internal://cache/${fileName}` }
- ]
- request.uploadFile(context, {
-
- url: '你的url 地址', // url 地址
-
- method: http.RequestMethod.POST, // 请求方法
- header: {
- // 和接口文档的要求的格式对象
- contentType: 'multipart/form-data',
- },
- files, // 文件信息
- data: [] // 额外提交的数据,不能省略
- })
- .then((res => {
- // 获取响应的内容
- res.on('headerReceive', (value) => {
- const uploadRes = (value as UploadResponse)
- const response = JSON.parse(uploadRes.body) as Response
- AlertDialog.show({
- message: response.data.url
- })
- this.img = response.data.url
- })
- }))
- })
- })
- }
- }
- .titleMode(NavigationTitleMode.Mini)
- .title('上传图片')
- }
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |