Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 无法从ionic 3应用程序将图像上载到服务器_Android_Angular_Ionic Framework_Ionic3 - Fatal编程技术网

Android 无法从ionic 3应用程序将图像上载到服务器

Android 无法从ionic 3应用程序将图像上载到服务器,android,angular,ionic-framework,ionic3,Android,Angular,Ionic Framework,Ionic3,我正在开发一个应用程序在离子3。我有一个工作流程,你可以上传照片使用相机或选择从画廊。 第一种情况是您选择摄像头,然后发送将图像直接上传到服务器。 第二种方案是从gallery中选择,然后选择不同的名称和参数,然后单击upload以上载图像 两者都使用了与下面相同的base64映像概念 this.uploadPicture = 'data:image/jpeg;base64,' + imageData; 选项的唯一区别是: 上传图片: let options: CameraOptions =

我正在开发一个应用程序在离子3。我有一个工作流程,你可以上传照片使用相机或选择从画廊。 第一种情况是您选择摄像头,然后发送将图像直接上传到服务器。 第二种方案是从gallery中选择,然后选择不同的名称和参数,然后单击upload以上载图像

两者都使用了与下面相同的base64映像概念

this.uploadPicture = 'data:image/jpeg;base64,' + imageData;
选项的唯一区别是: 上传图片:

let options: CameraOptions = {
  quality: 50,
  destinationType: this.camera.DestinationType.DATA_URL,
  encodingType: this.camera.EncodingType.JPEG,
  mediaType: this.camera.MediaType.PICTURE,
  sourceType : this.camera.PictureSourceType.PHOTOLIBRARY
};
对于摄像机:

options: CameraOptions = {
   quality: 50,
   destinationType: this.camera.DestinationType.DATA_URL,
   encodingType: this.camera.EncodingType.JPEG,
   mediaType: this.camera.MediaType.PICTURE
};
两者使用相同的功能上传图像

Upload(image,latitude,longitude,token) {
    let url = this.appConfig.apiBaseUrl+"deals";
    let requestoptions = this.buildRequest(url,'POST');
    requestoptions.body = {
        'image':image
    };

    let params: URLSearchParams = new URLSearchParams();
    params.set('latitude', latitude);
    params.set('longitude', longitude);
    params.set('token',token);
    requestoptions.params = params;
    return this.http.request(new Request(requestoptions))
      .map(
          (response: Response) => {
            let res: Object = response.json();
            return res;
         }
      ).catch(error => {
          return Observable.throw(error.json());
     });
  }
问题真的很奇怪:

1) 当我直接从相机点击时,它工作正常

2) 当我上传一张从互联网保存到设备上的图像时(例如whatsApp),它工作正常

3) 但是当我从gallery中拍摄一张由手机摄像头拍摄的图像时,该请求没有命中api,没有错误。奇怪的服务器端没有日志,我可以看到请求的格式正确。

请帮帮我

更新 我发现从下载的图像中得到的base64字符串长度比从gallery中得到的图像长度要小得多


有人能告诉我如何在上传之前保存gallery中的图像副本(使用选项),然后将其删除,这样base64字符串长度就更少了,这可能会导致上传过程中出现循环。

我不太熟悉您处理http请求的方法,但对于相同的任务,我使用了httpclient(5)。在本例中,我使用formData发布blob类型:

uploadSnippetBlob(blob: Blob, snippetId: string) {
console.log("uploading to Azure blob storage...")
let headers = new HttpHeaders().set('Authorization', this.userData.token);
let formData = new FormData(); 
formData.append("snippet", blob);
return this.http.post(this.apiBaseUrl+`/api/my/snippets/${snippetId}/thumbnail`, formData, { headers })
    .pipe(
        retry(1),
        timeoutWith(7000, Observable.throw(new Error('uploadSnippetThumbnailImage API call timed out'))),
        catchError(this.handleError('uploadSnippetThumbnailImage'))
    )
})


然后在组件中订阅此方法并处理响应/错误。

Hmm您使用的是什么http?Angular 5的httpclient还是?