【问题标题】:How can I solve FileSystemException: Cannot retrieve length of file, path ='...' (OS Error: No such file or directory, errno = 2)如何解决 FileSystemException:无法检索文件长度,路径 ='...'(操作系统错误:没有这样的文件或目录,errno = 2)
【发布时间】:2020-05-13 18:41:36
【问题描述】:

我正在尝试将用户模型从 dart 发送到我的文件在我的 c# 后端中设置为“IFormFile”数据类型的 api。 我尝试使用多部分请求,但得到的只是错误说明,我不明白为什么它无法检索文件的长度。

这是我的代码:

updateUser() async {
var uri = Uri.parse('http://myIP:8070/api/Users');
var request = http.MultipartRequest('Put', uri);
request.fields['id']="07bb2a17-7cd5-471b-973a-4b77d239b6c3";
request.fields['username']="beeso";
request.fields['email']="jake-username2@gmail.com";
request.fields['password']="Jake123-";
request.fields["oldPassword"]="Jake124-";
request.fields["gender"]="Male";
request.fields["dateOfBirth"]=DateTime.now().toString();
request.fields["name"]="dsjnss";
request.fields["languages"]=["Language1","Language2"].toString();
request.fields["nationalities"]=["Nationality1","Nationality2"].toString();
request.fields["phoneNumber"]="70502030";
request.fields["biography"]="jdnknkdas";
request.fields["info"]="asndasnkdas";
request.fields["religion"]="Christian";
request.fields["location"]="LA";
File imageFile = new File('Anatomy_of_a_Sunset-2.jpg');
var stream = new http.ByteStream(DelegatingStream.typed(imageFile.openRead()));
var length = await imageFile.length();
var multipartFile = new http.MultipartFile('file', stream, length,
    filename: basename(imageFile.path));
request.files.add(multipartFile);
Map<String, String> headers = {
  "content-type": "application/json"
};

request.headers.addAll(headers);
http.StreamedResponse response = await request.send();
print(response.statusCode);


}

任何帮助将不胜感激。

This picture shows where my file is located

【问题讨论】:

  • 1 - 您的内容类型不是 JSON,(它是多部分的),因此请省略该标头。 2 - MultipartFile 的另一个名称构造函数在期望文件时更好 - 它会为您节省两三行。 3 - 错误消息告诉您“解剖学...”文件不存在。它必须在不同的文件夹中或称为不同的名称。它在哪里?
  • 好吧,我现在把它改成了 "content-type": "multipart/form-data",Anatomy 文件和 pubspec.yaml 在同一个目录下(在它旁边),关于构造函数我尝试了很多,很多都给出了我不知道如何解决的错误,这就是我坚持下去的原因。 @RichardHeap
  • 这是一个飞镖应用吗?还是颤振应用?如果是后者,您可以访问这样的文件。您需要将其移动到资产并加载它。因为在纯 dart 应用程序中测试它更容易,所以创建一个新项目。如果您还没有,请下载 dart SDK (2.7.1) 并将您的 ide 的 dart 插件指向它。
  • 这是一个颤振应用程序,我在帖子中添加了一个链接以查看文件所在的位置。我之前也尝试过添加屏幕截图中显示的资产文件夹并添加文件而不是它。之后我从 pubspec.yaml 文件中加载它并将其作为 new File('assets/Anatomy_of_a_Sunset-2.jpg');但仍然是同样的错误。 @RichardHeap

标签: c# asp.net flutter dart multipart


【解决方案1】:

在 Flutter 中,您不能直接从项目中访问文件。您需要将它们添加到资产文件夹(通常为assets)以及pubspec.yaml。然后,不要使用File 来读取它们,而是使用rootBundle(或Asset 类之一)。

var multipartFile = http.MultipartFile.fromBytes(
  'file',
  (await rootBundle.load('assets/anatomy.jpg')).buffer.asUint8List(),
  filename: 'anatomy.jpg', // use the real name if available, or omit
  contentType: MediaType('image', 'jpg'),
);

request.files.add(multipartFile);

在测试您的 API 时,您可能会发现只创建一个 Dart 命令行项目会更容易,您可以在其中访问项目文件夹中的 Files。

【讨论】:

  • 我现在得到了这个:415 不支持的媒体类型客户端错误响应代码表明服务器拒绝接受请求,因为有效负载格式的格式不受支持。我的 c# 后端中有 profilePicture 作为 IFormFile
  • 首先使用 Postman 使其工作(参见 stackoverflow.com/questions/46895523/… 等)。然后使用 Postman 工作请求的屏幕截图更新问题。
  • 是否有 Anu 方式我可以在其中不发送任何文件并仍然在其中传递文件字段。当我在参数中传递 null 时,它给了我错误。
猜你喜欢
  • 2020-08-10
  • 2022-08-18
  • 1970-01-01
  • 2022-01-16
  • 2022-12-16
  • 2018-03-28
  • 2020-01-13
  • 2020-02-15
  • 1970-01-01
相关资源
最近更新 更多