HarmonyOS 鸿蒙Next 使用沙盒保存网络图片资源(http://xxx)保存失败 沙盒查看不到图片

发布于 1周前 作者 htzhanglong 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 使用沙盒保存网络图片资源(http://xxx)保存失败 沙盒查看不到图片
使用沙盒保存网络图片资源(http://xxx) 保存失败 沙盒查看不到图片

loadImageWithUrl(url: string, imgId:string) {
  let OutData: http.HttpResponse
  if (!url) {
    return;
  }
  http.createHttp().request(url,
    {
      method:http.RequestMethod.GET,
      connectTimeout:60000,
      readTimeout:60000

    }, async (error: BusinessError, data: http.HttpResponse) => {
      if (error) {
        console.error(`http reqeust failed with. Code: ${error.code}, message: ${error.message}`);
      } else {
        OutData = data
        let code: http.ResponseCode | number = OutData.responseCode;
        if (ResponseCode.ResponseCode.OK === code) {
          let context = getContext(this) as common.UIAbilityContext;
          let imageData: ArrayBuffer = OutData.result as ArrayBuffer;
          let filePath = context.cacheDir + "/"+imgId+'-a.jpg';
          let file = fs.openSync(filePath,fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE)
          fs.writeSync(file.fd,imageData)
          fs.closeSync(file);
        }
      }
    })
}

更多关于HarmonyOS 鸿蒙Next 使用沙盒保存网络图片资源(http://xxx)保存失败 沙盒查看不到图片的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

保存文件到应用沙箱

//Page7.ets
import SaveImageUtil from './SaveImageUtil'
import common from '@ohos.app.ability.common';


let context = getContext(this) as common.UIAbilityContext;
let filesDir = context.filesDir
let fileName ='food.png'

@Entry
@Component
struct Page7 {
  @State message: string = 'Hello World';

  build() {
    Column(){
      Button('点击')
        .onClick(()=>{
          /**
           * 保存文件到应用沙箱
           * @param image 图片url或base64
           * @param dirPath 保存文件夹路径
           * @param fileName 保存文件名
           */
          SaveImageUtil.saveImageToApplication('https://img2.baidu.com/it/u=4258186907,3858213948&fm=253&fmt=auto&app=138&f=JPEG?w=667&h=500',filesDir,fileName)
        })
    }
  }
}

保存图片工具类

//SaveImageUtil.ets
/**
 * 保存图片工具类
 */
import { BusinessError, request } from '@kit.BasicServicesKit'
import { common } from '@kit.AbilityKit'
import { buffer } from '@kit.ArkTS'
import { fileIo as fs } from '@kit.CoreFileKit'


class SaveImageUtil {
  private context = getContext(this) as common.UIAbilityContext

  /**
   * 保存文件到应用沙箱
   * @param image 图片url或base64
   * @param dirPath 保存文件夹路径
   * @param fileName 保存文件名
   */
  async saveImageToApplication(image: string, dirPath: string, fileName: string): Promise<SaveImageResultVo> {
    return new Promise(async (resolve: Function, reject: Function) => {
      if (!fs.accessSync(dirPath)) {
        fs.mkdirSync(dirPath)
      }
      if (image.startsWith('http')) {
        // 如果是网络图片,则下载图片
        try {
          request
            .downloadFile(this.context, { url: image, filePath: `${dirPath}/${fileName}` })
            .then((downloadTask) => {
              console.debug(`image => 保存图片到应用沙盒`)
              downloadTask
                .on('complete', () => {
                  // 图片下载完成
                  let vo = new SaveImageResultVo
                  vo.errorCode = 0
                  resolve(vo)
                })
              downloadTask
                .on('fail', (err: number) => {
                  let vo = new SaveImageResultVo
                  vo.errorCode = err
                  resolve(vo)
                })
            })
            .catch((error: BusinessError) => {
              reject(error)
            })
        } catch (err) {
          reject(err)
        }
      } else {
        // base64图片
        let content = image
        if (image.startsWith('data:')) {
          // 如果是data:,则截取,后的数据
          content = image.split(',')[1]
        }
        try {
          const decodeBuff = buffer.from(content, 'base64').buffer
          this.writeBufferToFile(dirPath,fileName,decodeBuff)


          let vo = new SaveImageResultVo
          vo.errorCode = 0
          resolve(vo)
        } catch (err) {
          reject(err)
        }
      }
    })
  }

  writeBufferToFile(dirPath: string, fileName: string, buf: ArrayBuffer) {
    if (!fs.accessSync(dirPath)) {
      // 如果文件夹不存在,则先创建文件夹
      fs.mkdirSync(dirPath)
    }

    let file = fs.openSync(`${dirPath}/${fileName}`, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)
    fs.writeSync(file.fd, buf)
    fs.closeSync(file)
  }

}

export class SaveImageResultVo {
  errorCode: number = 0
}

export default new SaveImageUtil()

更多关于HarmonyOS 鸿蒙Next 使用沙盒保存网络图片资源(http://xxx)保存失败 沙盒查看不到图片的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next系统中,使用沙盒保存网络图片资源(如http://xxx)时,若保存失败且沙盒中查看不到图片,可能是以下原因:

  1. 网络权限未配置:确保应用已正确配置网络访问权限,包括Internet访问权限。

  2. URL格式错误:检查图片URL是否正确,且该URL能够正常访问。

  3. 沙盒路径问题:确认沙盒保存路径是否正确,以及应用是否有权限写入该路径。

  4. 图片下载失败:可能是网络问题或服务器问题导致图片下载失败。

  5. 文件写入异常:在写入文件时可能遇到磁盘空间不足、文件系统错误等异常情况。

  6. 沙盒清理:检查系统或应用是否对沙盒进行了清理,导致保存的图片被删除。

  7. 文件读写权限:确保应用有读写沙盒文件的权限。

针对上述问题,可以逐一排查并修正。检查代码中的网络请求、文件路径、权限配置等部分,确保无误。同时,可以使用日志输出关键信息,帮助定位问题。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部