• flutter 阿里云上传文件


    业务背景: 服务器后端生成签名给前端; 前端通过 http 只接上传文件;这样不需要使用SDK 即可完成上传到 阿里云OSS, 这里使用的是  :PostObjecthttps://help.aliyun.com/document_detail/31988.html

    遇到的问题 :应为是 Flutter 应用这边使用的网络库是:http,上传的时候一直报:

    代码如下

    1. Future<ResponseBase> upLoadImage(
    2. {required String policy,
    3. required String signature,
    4. required String dir,
    5. required String fileName,
    6. required String filePath}) async {
    7. try {
    8. AppOverlay().showLoading(title: '正在上传...');
    9. Uri url = Uri.http('xxooxxoo.oss-cn-hangzhou.aliyuncs.com', '');
    10. MultipartRequest request = MultipartRequest('POST', url);
    11. request.fields['policy'] = policy;
    12. request.fields['signature'] = signature;
    13. request.fields['OSSAccessKeyId'] = 'LTAI5tKHpGbunzBrasdasdW';//换成自己的
    14. request.fields['key'] = '$dir/$fileName';
    15. http.MultipartFile multipartFile =
    16. await http.MultipartFile.fromPath("file", filePath);
    17. request.files.add(multipartFile);
    18. http.StreamedResponse response = await request.send();
    19. if (response.statusCode == 204) {
    20. //这里返回值用到了Stream回调
    21. ResponseBase _responseBase = ResponseBase(
    22. success: true,
    23. entityList: null,
    24. messageID: 0,
    25. content: '上传成功',
    26. );
    27. return _responseBase;
    28. } else {
    29. AppScreen.showToast('上传文件失败 请稍后再试 code:${response.statusCode}');
    30. return ResponseBase(
    31. messageID: response.statusCode,
    32. success: false,
    33. content: '上传文件失败 请稍后再试 ${response.statusCode}',
    34. entityList: '',
    35. );
    36. }
    37. } catch (exception) {
    38. AppScreen.showToast('上传文件失败 请稍后再试 ${exception.toString()}');
    39. // return ResponseBase(
    40. // errorCode: -100,
    41. // action: 0,
    42. // message: '网络异常 请稍后再试 -100',
    43. // success: false,
    44. // value: {'error get': exception.toString()},
    45. // );
    46. return ResponseBase(
    47. messageID: -100,
    48. success: false,
    49. content: '网络异常 请稍后再试 -100',
    50. entityList: '',
    51. );
    52. } finally {
    53. AppOverlay().hideLoading();
    54. }
    55. }

    报错信息

    "The body of your POST request is not well-formed multipart/form-data"

    1. <Error>
    2. <Code>MalformedPOSTRequest</Code>
    3. <Message>The body of your POST request is not well-formed multipart/form-data</Message>
    4. <RequestId>636C62D5FDF07836388721F1</RequestId>
    5. <HostId>pingchuang.oss-cn-hangzhou.aliyuncs.com</HostId>
    6. </Error>

    填坑发现

     flutter 'content-type' 字段在 'content-disposition' 字段的上面;然而 阿里云OSS 要求'content-type' 字段在 'content-disposition' 字段的下面

    好嘛 事已至此我们只能修改源文件了 MultipartRequest

     修改 http 底层文件:

    找到 MultipartRequest.dart ,

    在这里大家最好复制一份出来; 不要在源文件上面修改!

     

     

     找到这个方法,修改成下面的样子:

     实际上就是 换了下位置!

    1. /// Returns the header string for a file.
    2. ///
    3. /// The return value is guaranteed to contain only ASCII characters.
    4. String _headerForFile(MultipartFile file) {
    5. // var header = 'content-type: ${file.contentType}\r\n'
    6. // 'content-disposition: form-data; name="${_browserEncode(file.field)}"';
    7. //
    8. // if (file.filename != null) {
    9. // header = '$header; filename="${_browserEncode(file.filename!)}"';
    10. // }
    11. // return '$header\r\n\r\n';
    12. var header = '';
    13. if (file.filename != null) {
    14. header =
    15. 'content-disposition: form-data; name="${_browserEncode(file.field)}"; filename="${_browserEncode(file.filename!)}"\r\n'
    16. 'content-type: ${file.contentType}';
    17. } else {
    18. header =
    19. 'content-disposition: form-data; name="${_browserEncode(file.field)}"\r\n'
    20. 'content-type: ${file.contentType}';
    21. }
    22. return '$header\r\n\r\n';
    23. }

    换完成功我门再试下:

     

     成功返回 204 说明是成功了!

  • 相关阅读:
    VOLTE呼叫流程介绍
    【21天学习挑战赛】—Java编程进阶之路(4)
    ICC2:Design Planning(02)Shaping Placement
    博迪投资学·投资组合:第六七章的模型总结
    C++11标准模板(STL)- 算法(std::partition_point)
    『忘了再学』Shell基础 — 21、变量的测试与内容置换
    TypeScript环境配置详解
    【pen200-lab】10.11.1.73
    什么是勒索病毒?如何预防?
    C# 自定义控件库之Lable组合控件
  • 原文地址:https://blog.csdn.net/nicepainkiller/article/details/127784294