【问题标题】:flutter_uploader on Android does not return 'response' data in listenerAndroid 上的 flutter_uploader 不会在侦听器中返回“响应”数据
【发布时间】:2022-11-03 13:18:37
【问题描述】:

我已经使用flutter_uploader 3.0.0-beta.4包,我让它像在 iOS 上宣传的那样工作,但无法在 Android 上返回的侦听器结果中获得任何响应数据。

我按照开发人员指南调整了 AndroidManifest.xml 文件,但这些设置不断使 Android 应用程序构建崩溃,抱怨双启动 WorkManager。 我什至可以为 Android 构建应用程序的唯一方法是在 AndroidManifest 文件中使用以下设置:

<application 
...
all default flutter generated settings here
... 
      <provider
            android:name="androidx.startup.InitializationProvider"
            android:authorities="${applicationId}.androidx-startup"
            android:exported="false"
            android:enabled="false"
            tools:node="merge">
            <!-- If you are using androidx.startup to initialize other components -->
            <meta-data
                android:name="androidx.work.WorkManagerInitializer"
                android:value="androidx.startup"
                android:enabled="false"
                android:exported="false"
                tools:node="remove" />
        </provider>

        <provider
            android:name="com.bluechilli.flutteruploader.FlutterUploaderInitializer"
            android:authorities="${applicationId}.flutter-uploader-init"
            android:exported="false">
            <meta-data
                android:name="com.bluechilli.flutteruploader.MAX_CONCURRENT_TASKS"
                android:value="3" />
            <meta-data
                android:name="com.bluechilli.flutteruploader.UPLOAD_CONNECTION_TIMEOUT_IN_SECONDS"
                android:value="3600" />
        </provider>
</application>

然后在颤振我入队()带有文件和一些额外数据对象的 MultipartFormDataUpload() 块,所有这些都发送到 PHP 并按预期到达,文件上传,所有数据都在 PHP 脚本中,然后服务器端脚本发回一个 jsonEncoded 对象,在 iOS 上,此 json 对象返回到侦听器 result.response 数据中,但在 Android 上,响应数据部分永远不会填充。

// UPLOAD IMAGE FILE
queuedPhoto.uploadTaskId = await _uploaderService.enqueue(
  MultipartFormDataUpload(
    url: _httpService.url(EndPoint.uploadPhoto).toString(),
    files: [FileItem(path: filePath, field: "fileToUpload")],
    method: UploadMethod.POST,
    headers: {
      'Authorization': 'Bearer $token',
    },
    data: {
      "groupPath": groupPath,
      "clientId": '${queuedPhoto.clientId}',
      "projectId": '${queuedPhoto.projectId}',
      "mapId": '${queuedPhoto.mapId}',
      "groupId": '${queuedPhoto.groupId}',
      "userId": '${queuedPhoto.userId}',
      "dateCreated": '${queuedPhoto.dateCreated}',
      "filepath": queuedPhoto.filename,
      "type": queuedPhoto.type,
      "thumbpath": queuedPhoto.thumbnail,
      "note": queuedPhoto.note,
      "lat": queuedPhoto.lat,
      "lon": queuedPhoto.lon,
      "dir": '${queuedPhoto.dir}',
      "tags": queuedPhoto.tags.map((t) => t.name).whereNotNull().toList().join(','),
      "subtags": queuedPhoto.tags
          .map((t) => t.subtag != null ? '${t.subtag?.tagName}_${t.subtag?.name}' : null)
          .whereNotNull()
          .toList()
          .join(','),
      "appVersion": queuedPhoto.appVersion,
      "gpsAccuracy": '${queuedPhoto.gpsAccuracy}',
    },
    tag: filename,
  ),
);
_uploaderService.progress.listen((progress) {
  if (queuedPhoto.uploadTaskId == progress.taskId) {
    queuedPhoto.uploadProgress = progress.progress;
  }
  uploadProgressSubject$.add(progress.progress ?? 0);
});
_uploaderService.result.listen((result) {
  if (queuedPhoto.uploadTaskId == result.taskId && queuedPhoto.uploadProgress == 100) {
    completedUpload(result);
  }
}, onError: (ex, stacktrace) {
  errorUpload();
});

进度监听器按预期工作,结果监听器也得到结果调用(在上传期间多次使用不相关的 taskId,应该有这么多不相关的流结果吗??),通过监听器的最终结果是正确的taskId 和所有结果对象似乎都是正确的,除了没有 result.response 对象,它始终保持为空,在上面的侦听器中,我添加了一个上传进度检查以尝试将结果流限制为仅最终结果(我也检查了所有其他看似无关的任务 ID 的结果,但对于每个任务 ID,响应数据始终为空)。

我是否应该将任何设置更改为 Android 配置文件,或者服务器端 PHP 脚本是否应该以特定格式返回 json 数据?

我无法弄清楚这一点,因为 iOS 一切正常,而在 Android 上,所有其他服务器端数据 GET 和 POST 调用工作正常,并返回由 Android/Flutter 正确接收和解码的 json 编码数据。

【问题讨论】:

    标签: android flutter


    【解决方案1】:

    我终于解决了这个问题。 因为flutter_uploader MultipartFormDataUpload() 请求标头设置为“multipart/form-data”之类的东西,所以我的PHP 脚本没有将返回标头的内容类型重置为预期的“application/json;charset=utf-8”。 它适用于 iOS,但不适用于 Android。

    我修复了我的 PHP 脚本以强制使用返回数据的标题。

    <?php
      ....
      header("Content-Type: application/json;charset=utf-8");
      echo json_encode($SomeObjectArray);
    

    【讨论】:

      猜你喜欢
      • 2016-04-29
      • 1970-01-01
      • 2013-08-07
      • 2012-05-20
      • 2012-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-27
      相关资源
      最近更新 更多