[文章]HarmonyOS应用开发-文件上传问题的解决方式

阅读量0
0
1
在之前的分享中,曾经提到一个文件上传的问题
/data/user/0/cn.jltf.neighbor/files/534.jpg: open failed: ENOENT (No such file)
该文件不存在。但实际上该文件存在并能显示出来。后来发现是鸿蒙系统的权限问题,只能访问私有目录下的文件。
解决方法:将文件复制到私有目录下,再进行访问。
代码如下:
  1. HiLog.info(label,"私有目录:"+this.getFilesDir());
  2.         HiLog.info(label,"缓存目录:"+this.getCacheDir());
  3.         HiLog.info(label,"数据目录:"+this.getDataDir());
  4.         HiLog.info(label,"外部目录:"+this.getExternalCacheDir());
  5.         HiLog.info(label,"引用目录:"+this.getPreferencesDir());
  6.         HiLog.info(label,"同步目录:"+this.getDistributedDir());
  7.         HiLog.info(label,"应用目录:"+this.getDir("", Context.MODE_PRIVATE));
  8.         File[] dataChildFiles = this.getDataDir().listFiles();
  9.         for (File dataChildFile : dataChildFiles) {
  10.             HiLog.info(label,"数据子目录:"+dataChildFile);
  11.         }
  12.         File[] externalFiles=this.getExternalMediaDirs();
  13.         for (File externalFile : externalFiles) {
  14.             HiLog.info(label,"外部Media目录:"+externalFile);
  15.         }

  16.         try {
  17.             //该目录和JSUI中的internal://cache/目录是一个目录
  18.             File file=new File(this.getCacheDir()+"/111.jpg");
  19.             HiLog.info(label,"文件路径:"+file);
  20.             if(file.exists())
  21.             {
  22.                 HiLog.info(label,"文件已存在");
  23.                return;
  24.             }
  25.             HiLog.info(label,"文件不存在");
  26.           InputStream inputStream = getContext().getResourceManager().getResource(ResourceTable.Media_icon);
  27.             ImageSource.SourceOptions srcOpts = new ImageSource.SourceOptions();
  28.             srcOpts.formatHint = "image/jpeg";
  29.             ImageSource imageSource = ImageSource.create(inputStream, srcOpts);


  30.             // 设置图片参数
  31.             ImageSource.DecodingOptions decodingOptions = new ImageSource.DecodingOptions();
  32.             decodingOptions.desiredSize=new Size(200,200);
  33.             imageSource.createPixelmap(decodingOptions);
  34.             //该种方式直接访问internal://app目录//            FileOutputStream fos=new FileOutputStream("/data/user/0/com.example.abilitytransfertest/files//111.jpg");
  35.             FileOutputStream fos=new FileOutputStream(this.getCacheDir()+"/111.jpg");


  36.             ImagePacker imagePacker = ImagePacker.create();
  37.             ImagePacker.PackingOptions packingOptions = new ImagePacker.PackingOptions();
  38.             packingOptions.format = "image/jpeg";
  39.             packingOptions.quality = 90;
  40.             boolean result = imagePacker.initializePacking(fos, packingOptions);
  41.             if(result)
  42.             {
  43.                 result = imagePacker.addImage(imageSource.createPixelmap(decodingOptions));
  44.                 if (result) {
  45.                     long dataSize = imagePacker.finalizePacking();
  46.                     HiLog.info(label,"文件大小:"+dataSize);
  47.                 }
  48.             }

  49.             fos.flush();
  50.             fos.close();
  51.             if(file.exists())
  52.             {
  53.                 HiLog.info(label,"文件已存在");
  54.                 return;
  55.             }
  56.         } catch (IOException | NotExistException e) {
  57.             HiLog.info(label,"文件保存出错:"+e.getMessage());
  58.             e.printStackTrace();
  59.         }

  60.         File file=this.getCacheDir();
  61.         File[] files = file.listFiles();
  62.         for (File file1 : files) {
  63.             HiLog.info(label,"File目录:"+file1);
  64.         }
复制代码

回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友