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

ni65a41a  于 2024-01-04  发布在  其他
关注(0)|答案(1)|浏览(140)

我尝试使用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);

字符串
我是否需要在其他地方更改某些访问文件?请帮助我解决此问题。

z18hc3ub

z18hc3ub1#

这段代码似乎有一些问题。
看起来循环遍历图像可能有语法错误,并且函数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.添加了一个return语句,用于返回zipImages函数中创建的zip文件的路径。

确保您有正确的错误处理和必要的导入(import 'dart:io';, import 'dart:typed_data';, and package:archive/archive.dart)
另外,请确保正确定义FFUploadedFile类或相关数据结构,并授予访问目录/文件的权限。

相关问题