对象存储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,搭建一个在线教育视频课程分享网站。
相关文章
|
1天前
|
JSON JavaScript 前端开发
什么是HTTP POST请求?初学者指南与示范
HTTP POST请求是一种常用的HTTP方法,主要用于向服务器发送数据。通过合理设置请求头和请求主体,可以实现数据的可靠传输。无论是在客户端使用JavaScript,还是在服务器端使用Node.js,理解和掌握POST请求的工作原理和应用场景,对于Web开发至关重要。
40 18
|
6天前
|
存储 应用服务中间件 开发工具
对象存储OSS-Python设置代理访问请求
通过 Python SDK 配置 nginx 代理地址请求阿里云 OSS 存储桶服务。示例代码展示了如何使用 RAM 账号进行身份验证,并通过代理下载指定对象到本地文件。
46 15
|
20小时前
|
JSON 数据格式
.net HTTP请求类封装
`HttpRequestHelper` 是一个用于简化 HTTP 请求的辅助类,支持发送 GET 和 POST 请求。它使用 `HttpClient` 发起请求,并通过 `Newtonsoft.Json` 处理 JSON 数据。示例展示了如何使用该类发送请求并处理响应。注意事项包括:简单的错误处理、需安装 `Newtonsoft.Json` 依赖,以及建议重用 `HttpClient` 实例以优化性能。
36 2
|
18天前
|
Web App开发 大数据 应用服务中间件
什么是 HTTP Range请求(范围请求)
HTTP Range 请求是一种非常有用的 HTTP 功能,允许客户端请求资源的特定部分,从而提高传输效率和用户体验。通过合理使用 Range 请求,可以实现断点续传、视频流播放和按需加载等功能。了解并掌握 HTTP Range 请求的工作原理和应用场景,对开发高效的网络应用至关重要。
56 15
|
18天前
|
Web App开发 网络安全 数据安全/隐私保护
Lua中实现HTTP请求的User-Agent自定义
Lua中实现HTTP请求的User-Agent自定义
|
存储 Web App开发 监控
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
我们以前使用过的对hbase和hdfs进行健康检查,及剩余hdfs容量告警,简单易用 1.针对hadoop2的脚本: #/bin/bashbin=`dirname $0`bin=`cd $bin;pwd`STATE_OK=...
1060 0
|
SQL Web App开发 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
在运行一个group by的sql时,抛出以下错误信息: Task with the most failures(4):  -----Task ID:  task_201411191723_723592_m_000004URL:  http://DDS0204.
977 0
|
Web App开发 监控 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
Hbase依赖的datanode日志中如果出现如下报错信息:DataXceiverjava.io.EOFException: INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Exception in receiveBlock for block  解决办法:Hbase侧配置的dfs.socket.timeout值过小,与DataNode侧配置的 dfs.socket.timeout的配置不一致,将hbase和datanode的该配置调成大并一致。
803 0
|
Web App开发 存储 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
1.HBase依赖于HDFS,HBase按照列族将数据存储在不同的hdfs文件中;MongoDB直接存储在本地磁盘中,MongoDB不分列,整个文档都存储在一个(或者说一组)文件中 (存储) 2.
736 0
|
Web App开发 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
PipeMapRed.waitOutputThreads(): subprocess failed with code X ,这里code X对应的信息如下:error code 1: Operation not perm...
949 0

热门文章

最新文章

相关产品

  • 对象存储