对象存储oss使用问题之flutter使用http库进行post请求文件上传返回400如何解决

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: 《对象存储OSS操作报错合集》精选了用户在使用阿里云对象存储服务(OSS)过程中出现的各种常见及疑难报错情况,包括但不限于权限问题、上传下载异常、Bucket配置错误、网络连接问题、跨域资源共享(CORS)设定错误、数据一致性问题以及API调用失败等场景。为用户降低故障排查时间,确保OSS服务的稳定运行与高效利用。

问题一:SDK调用智能媒体管理的GenerateWebofficeToken失败,有没有大佬遇到?


接口GenerateWebofficeToken 在线调试成功。本地sdk示例代码调整后失败


参考回答:

如果在线调试成功,但在本地SDK示例代码中调用智能媒体管理的GenerateWebofficeToken接,可能是由于以下几个原因导致的:

  1. 网络问题:确保您的本地网络环境正常,可以访问到智能媒体管理的服务端。
  2. 参数配置:检查您在本地代码中使用的参数是否与在线调试时一致,特别是API密钥、应用ID等敏感信息。
  3. 权限问题:确保您的账户或应用具有调用GenerateWebofficeToken接口的权限。
  4. SDK版本:确认您使用的SDK版本是否为最新,旧版本的SDK可能不支持某些功能或者存在已知问题。
  5. 依赖库:检查是否正确安装了所有必要的依赖库,并且它们的版本与SDK要求的版本相匹配。
  6. 错误处理:查看是否有错误日志输出,根据错误信息进行调试。如果没有错误日志,可以尝试添加日志记录来帮助诊断问题。
  7. 环境差异:有时线上环境和本地开发环境之间可能存在差异,比如环境变量、系统路径等,这些都可能影响到SDK的正常工作。
  8. 编码问题:确保您的代码文件没有编码问题,特别是在处理字符串参数时,不正确的编码可能会导致请求失败。
  9. 时间同步:服务器的时间戳和您的本地机器时间不同步也可能导致一些验证失败。
  10. 防火墙/安全软件:检查您的防火墙或安全软件设置,确保它们没有阻止SDK的网络请求。

如果您已经检查了上述所有可能性,但问题仍然存在,建议查看SDK的官方文档或联系技术支持获取更详细的帮助。同时,您也可以提供更多的错误信息或代码片段,以便更好地定位问题。


关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/609185


问题二:阿里云oss公网图片链接在浏览器地址栏输入后可正常显示,放到商城显示403错误,是什么原因



参考回答:

阿里云对象存储服务(OSS)公网图片链接在浏览器直接输入可以正常显示,但在商城中显示403错误,通常有以下几种可能的原因:

  1. 防盗链设置
  • 阿里云OSS支持防盗链功能,如果启用了防盗链,并且没有将商城服务器的IP地址或者域名加入到允许访问的白名单中,则从商城加载图片时会被拒绝,返回403错误。
  1. 访问权限控制
  • OSS中的Bucket或Object访问权限设置不正确。例如,只设置了公共读而没有设置匿名访问权限,或者设置了仅限特定用户或角色访问,这可能导致除了直接通过浏览器访问之外的其他引用请求失败。
  1. URL签名过期
  • 如果使用了带有签名的临时URL访问图片,在一定有效期后未更新签名,链接会失效并导致403错误。
  1. CDN缓存问题
  • 如果OSS Bucket配置了CDN加速,可能存在CDN缓存策略或刷新问题,尤其是当最近对OSS权限做了调整之后,可能需要清理或刷新CDN缓存才能生效。
  1. 跨域资源共享(CORS)限制
  • 如果商城应用与OSS不在同一个域下,而OSS上未正确配置CORS规则以允许商城所在域名进行资源请求,也会导致访问被禁止。
  1. 商城端代码处理
  • 商城应用在加载图片时,可能会对URL进行额外的处理,比如编码、拼接等,这些处理不当可能会导致实际访问的URL与直接在浏览器中输入的有效URL不同,从而产生403错误。

为了解决这个问题,您需要检查以下几个方面:

  • 确认OSS的访问控制列表(ACL)和 bucket 策略是否允许商城应用的来源访问。
  • 检查防盗链设置是否包含商城服务器的来源。
  • 如果使用了CDN,请检查CDN相关的配置及缓存状态。
  • 确认商城应用加载图片的方式以及是否涉及CORS问题,并相应地在OSS上配置正确的CORS规则。


关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/604700


问题三:flutter使用http库进行post请求文件上传返回400

 

通过后台获取到policy信息之后进行文件上传,结果使用http库一直提示400

使用postman或者apifox都可以上传成功

Future<String?> uplaodFile({required File file}) async {
  // 获取policy信息
    final ossPolicy = await getOSSPolicy(filename: path.basename(file.path));
    if (ossPolicy == null) {
      return null;
    }
    // Content-type
    final type = mime(path.basename(file.path))?.split("/").first;
    final subtype = mime(path.basename(file.path))?.split("/").last;
    // Form-data
    var request =
        http.MultipartRequest("POST", Uri.parse(ossPolicy.host ?? ossUrl))
          ..fields["OSSAccessKeyId"] = ossPolicy.accessKeyId ?? ""
          ..fields["Signature"] = ossPolicy.signature ?? ""
          ..fields["policy"] = ossPolicy.policy ?? ""
          ..fields["key"] = ossPolicy.fileId.toKey()
          ..fields["success_action_status"] = "200"
          ..files.add(await http.MultipartFile.fromPath('file', file.path,
        contentType: MediaType(type ?? "text", subtype ?? "plain")));
    final response = await request.send();
    if (response.statusCode != 200) {
      logger.e(await response.stream.bytesToString());
      return null;
    }
    return ossPolicy.fileId;
  }

请求返回结果:

I/flutter (13104): │ ⛔ <?xml version="1.0" encoding="UTF-8"?>
I/flutter (13104): │ ⛔ <Error>
I/flutter (13104): │ ⛔   <Code>MalformedPOSTRequest</Code>
I/flutter (13104): │ ⛔   <Message>The body of your POST request is not well-formed multipart/form-data</Message>
I/flutter (13104): │ ⛔   <RequestId>65C0AFBC84CC8A3733DFF7C4</RequestId>
I/flutter (13104): │ ⛔   <HostId>oss.*****.com</HostId>
I/flutter (13104): │ ⛔   <EC>0006-00000109</EC>
I/flutter (13104): │ ⛔   <RecommendDoc>https://api.aliyun.com/troubleshoot?q=0006-00000109</RecommendDoc>
I/flutter (13104): │ ⛔ </Error>
I/flutter (13104): │ ⛔

网上查看说是PostObject请求中表单域格式不正确

那这该如何修改???


参考回答:

根据错误信息The body of your POST request is not well-formed multipart/form-data,问题可能出在MultipartFormData的构造上。确保您正确设置了所有必需的表单字段和文件,并且格式符合OSS服务的要求。

您可以尝试以下修改后的代码:

import 'package:http/http.dart' as http;
import 'dart:convert';
import 'package:mime_type/mime_type.dart';
Future<String?> uploadFile({required File file}) async {
  // 获取policy信息
  final ossPolicy = await getOSSPolicy(filename: path.basename(file.path));
  if (ossPolicy == null) {
    return null;
  }
  // Content-type
  final type = mime(path.basename(file.path))?.type;
  // Form-data
  var request = http.MultipartRequest("POST", Uri.parse(ossPolicy.host ?? ossUrl))
    ..headers.addAll({
      'Content-Type': 'multipart/form-data',
    })
    ..fields.addAll({
      'OSSAccessKeyId': ossPolicy.accessKeyId ?? '',
      'Signature': ossPolicy.signature ?? '',
      'policy': base64Encode(utf8.encode(ossPolicy.policy ?? '')),
      'key': ossPolicy.fileId.toKey(),
      'success_action_status': '200',
    })
    ..files.add(await http.MultipartFile.fromPath(
      'file',
      file.path,
      contentType: MediaType(type),
    ));
  final response = await request.send();
  if (response.statusCode != 200) {
    logger.e(await response.stream.bytesToString());
    return null;
  }
  return ossPolicy.fileId;
}

这里做了一些调整:

  1. policy字段值转换为Base64编码,因为有时候policy可能包含特殊字符,需要进行URL安全的Base64编码。
  2. 添加了Content-Type头,虽然http库会自动处理这个,但有时明确设置可能会解决问题。
  3. 确保contentType属性直接使用mime库获取到的类型。

请检查并确认您的getOSSPolicy函数返回的policy是否需要Base64编码,如果不需要,请恢复原样。同时,请确保其他字段(如accessKeyId、signature等)的格式与后端要求一致。


关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/595751


问题四:使用Typora+picgo+oss ,pigcgo上传失败


打算用Typora+picgo+oss弄个笔记,但是picgo上传一直失败,试了好几种都不行,

是阿里云上有什么没设置吗


参考回答:

根据您提供的信息,picgo上传失败的原因可能是阿里云OSS的域名解析问题。您可以尝试以下方法解决这个问题:

  1. 检查您的阿里云OSS配置是否正确。确保您的Bucket名称、AccessKey ID和AccessKey Secret是正确的。您可以在阿里云控制台的OSS服务页面查看和管理这些信息。
  2. 确保您的网络环境可以访问阿里云OSS。如果您的网络环境无法访问阿里云OSS,您可能需要检查您的网络设置或联系您的网络管理员。
  3. 检查您的DNS设置。如果您的计算机无法解析阿里云OSS的域名,您可能需要检查您的DNS设置或联系您的网络管理员。


关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/571781


问题五:oss上传文件报证书错误


之前上传功能是好的,但是不知道从哪个版本开始功能就不能正常使用了,回滚到之前的版本也不行,但是之前打的测试包是可以的,调用代码如下,会走onfailure,报错信息为:[ErrorMessage]: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.


参考回答:

这个错误信息表明,你的Java应用程序在尝试验证OSS服务器的SSL证书时出现了问题。这可能是由于以下几种原因:

  1. SSL证书问题:可能是你的OSS服务器的SSL证书已经过期,或者不被信任。你可以检查你的SSL证书,看看是否有任何问题。
  2. Java安全配置问题:可能是你的Java应用程序的安全配置有问题。例如,你可能需要在你的Java应用程序中信任OSS服务器的SSL证书。
  3. 网络问题:可能是你的网络连接不稳定,或者网速过慢。你可以尝试更换网络,或者提高网络速度。
  4. OSS服务问题:可能是阿里云的OSS服务出现了问题。


关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/565923

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
相关文章
|
7天前
|
存储 缓存 网络协议
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点,GET、POST的区别,Cookie与Session
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点、状态码、报文格式,GET、POST的区别,DNS的解析过程、数字证书、Cookie与Session,对称加密和非对称加密
|
7天前
|
缓存 安全 API
http 的 get 和 post 区别 1000字
【10月更文挑战第27天】GET和POST方法各有特点,在实际应用中需要根据具体的业务需求和场景选择合适的请求方法,以确保数据的安全传输和正确处理。
|
9天前
|
安全 前端开发 JavaScript
利用HTTP协议进行文件上传和下载的常见方法
【10月更文挑战第25天】可以利用HTTP协议方便地实现文件的上传和下载功能,满足不同应用场景下的需求。在实际应用中,还可以根据具体的业务需求和安全要求,对文件上传和下载的过程进行进一步的优化和安全处理。
|
7天前
|
存储 弹性计算 数据管理
阿里云对象存储OSS收费标准,存储、流量和请求等多个计费项
阿里云对象存储OSS提供按量付费与包年包月两种计费方式,涵盖存储、流量、请求等费用。标准存储按量付费0.09元/GB/月,包年包月40GB起售,价格9元/年。公网流量出方向收费,内网及上传免费。具体费用视使用情况而定,详情见官网。
|
1月前
|
JSON 编解码 安全
【HTTP】方法(method)以及 GET 和 POST 的区别
【HTTP】方法(method)以及 GET 和 POST 的区别
86 1
|
3月前
automate Flow中如何用HTTP,POST的方式发送短信?
automate Flow中如何用HTTP,POST的方式发送短信?
39 2
|
3月前
|
XML 安全 Android开发
Flutter配置Android和IOS允许http访问
Flutter配置Android和IOS允许http访问
106 3
|
4月前
|
JSON Dart API
Flutter dio http 封装指南说明
本文介绍了如何实现一个通用、可重构的 Dio 基础类,包括单例访问、日志记录、常见操作封装以及请求、输出、报错拦截等功能。
106 2
Flutter dio http 封装指南说明
|
5月前
|
存储 Java Maven
大事件后端项目31--------文件上传_阿里云OSS_入门程序
大事件后端项目31--------文件上传_阿里云OSS_入门程序
|
5月前
|
存储 运维 Java
大事件后端项目30------文件上传_阿里云OSS_准备工作
大事件后端项目30------文件上传_阿里云OSS_准备工作

相关产品

  • 对象存储
  • 下一篇
    无影云桌面