如何修复未处理的异常:PathAccessException:无法打开文件,路径 = 'images.zip'(操作系统错误:不允许操作,errno = 1)?

问题描述 投票:0回答:1

我正在尝试使用 Archive 库在 Dart 中编写代码,将用户上传的图像打包到 Zip 文件中,然后将该 zip 文件上传到 Firebase。但是,我的编译器说它无法打开该文件。这是我的代码:

Future<String> zipImages(List<FFUploadedFile> images) async {
  final archive = Archive();

  for (for final image in images; i++) {
    print(image);
    Uint8List? bytes = image.bytes;

    Future<File> createTemporaryFile(Uint8List? bytes, int num) async {
      Directory tempDir = await getTemporaryDirectory();
      String tempPath = tempDir.path + '/image';
      File tempFile = File(tempPath);
      await tempFile.writeAsBytes(bytes as List<int>);
      return tempFile;
    }

    File tempFile = await createTemporaryFile(bytes, i);

    final bytesFromFile = await tempFile.readAsBytes();
    final archiveFile =
        ArchiveFile('uploadedImages', bytesFromFile.length, bytesFromFile);

    archive.addFile(archiveFile);
  }

  final zipEncoder = ZipEncoder();
  final encodedArchive = zipEncoder.encode(archive);
  if (encodedArchive == null) return "error";

  final zipFile = await File('images.zip').writeAsBytes(encodedArchive);

我需要在其他地方更改一些访问文件吗?请帮我解决这个问题。

flutter dart file zip archive
1个回答
0
投票

这段代码似乎有一些问题。

迭代图像的循环似乎可能存在语法错误,并且函数

createTemporaryFile
是在循环内定义的,这是不必要的并且可能会导致问题。

尝试使用以下修改后的代码段,

import 'dart:io';
import 'dart:typed_data';
import 'package:archive/archive.dart';

Future<String> zipImages(List<FFUploadedFile> images) async {
  final archive = Archive();
  int i = 0;

  for (final image in images) {
    Uint8List? bytes = image.bytes;

    // Creating a temporary file for each image
    File tempFile = await createTemporaryFile(bytes, i);
    final bytesFromFile = await tempFile.readAsBytes();
    final archiveFile =
        ArchiveFile('uploadedImage$i', bytesFromFile.length, bytesFromFile);

    archive.addFile(archiveFile);
    i++;
  }

  final zipEncoder = ZipEncoder();
  final encodedArchive = zipEncoder.encode(archive);
  if (encodedArchive == null) return "error";

  final zipFile = await File('images.zip').writeAsBytes(encodedArchive);
  return zipFile.path; // Returning the path to the created zip file
}

Future<File> createTemporaryFile(Uint8List? bytes, int num) async {
  Directory tempDir = await getTemporaryDirectory();
  String tempPath = '${tempDir.path}/image$num'; // Unique name for each image
  File tempFile = File(tempPath);
  await tempFile.writeAsBytes(bytes!);
  return tempFile;
}

变化,

1.将

createTemporaryFile
函数的定义移到循环之外。

2.将循环迭代更改为更常规的格式。

3.为临时目录中的每个图像文件使用唯一的名称。

4.在

zipImages
函数中添加了 return 语句以返回创建的 zip 文件的路径。

确保您有正确的错误处理和必要的导入

(import 'dart:io';, import 'dart:typed_data';, and package:archive/archive.dart)

此外,请确保正确定义

FFUploadedFile
类或相关数据结构,并授予访问目录/文件的权限。

© www.soinside.com 2019 - 2024. All rights reserved.