Android 无法从ionic 3应用程序将图像上载到服务器
我正在开发一个应用程序在离子3。我有一个工作流程,你可以上传照片使用相机或选择从画廊。 第一种情况是您选择摄像头,然后发送将图像直接上传到服务器。 第二种方案是从gallery中选择,然后选择不同的名称和参数,然后单击upload以上载图像 两者都使用了与下面相同的base64映像概念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 =
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还是?