flutter web如何获取文件长度

在Flutter Web中,如何获取上传文件的大小(字节长度)?尝试了File对象的length方法,但在Web端始终返回0。是否有其他API或方案可以正确获取文件长度?需要兼容Chrome/Firefox等主流浏览器。

2 回复

在Flutter Web中,使用File类的length方法获取文件长度。例如:

File file = File('path/to/file');
int length = await file.length();

注意:Flutter Web中文件操作受浏览器限制,部分功能可能受限。

更多关于flutter web如何获取文件长度的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在 Flutter Web 中获取文件长度(即文件大小),可以通过以下方法实现:

1. 使用 File 类(适用于用户选择的文件)

如果文件来自用户通过文件选择器上传,可以使用 dart:html 中的 File 类:

import 'dart:html';

void getFileSize(File file) {
  int fileSize = file.size; // 文件大小(字节)
  print('文件大小: $fileSize bytes');
  print('文件大小: ${(fileSize / 1024).toStringAsFixed(2)} KB');
}

完整示例:

import 'dart:html';

void main() {
  InputElement uploadInput = FileUploadInputElement();
  uploadInput.accept = '*'; // 允许所有文件类型
  uploadInput.onChange.listen((e) {
    final files = uploadInput.files;
    if (files.isNotEmpty) {
      File file = files[0];
      print('文件名: ${file.name}');
      print('文件大小: ${file.size} bytes');
    }
  });
  document.body.children.add(uploadInput);
}

2. 通过网络请求获取远程文件大小

对于远程文件,可以通过 HTTP HEAD 请求获取文件大小:

import 'dart:html';

Future<int> getRemoteFileSize(String url) async {
  try {
    HttpRequest request = await HttpRequest.request(
      url,
      method: 'HEAD',
    );
    String? contentLength = request.getResponseHeader('content-length');
    return contentLength != null ? int.parse(contentLength) : -1;
  } catch (e) {
    print('获取文件大小失败: $e');
    return -1;
  }
}

// 使用示例
void main() async {
  String fileUrl = 'https://example.com/file.pdf';
  int size = await getRemoteFileSize(fileUrl);
  if (size > 0) {
    print('远程文件大小: $size bytes');
  }
}

注意事项:

  1. 文件选择器:Web 环境中需要通过 <input type="file"> 获取用户文件
  2. 跨域问题:远程文件需要服务器允许 CORS
  3. 单位转换
    String formatSize(int bytes) {
      if (bytes < 1024) return '$bytes B';
      if (bytes < 1048576) return '${(bytes / 1024).toStringAsFixed(2)} KB';
      return '${(bytes / 1048576).toStringAsFixed(2)} MB';
    }
    

这些方法适用于 Flutter Web 环境,能够准确获取本地和远程文件的长度信息。

回到顶部