IOS 如何使用 nativescript-camera 和 nativescript-background-http 上传图片
How to upload an image with nativescript-camera and nativescript-background-http on IOS
我可以使用 nativescript-camera
和 nativescript-background-http
将 android 上的文件上传到 C# web api。
我将参数设置如下:
var params = [{ name: "image", filename: fileUri, mimeType: 'application/octet-stream' }];
...
并发送请求:
let request = {
url: this.API_URL + "/UploadOctetFile",
method: "POST",
headers: {
"Authorization": accessTokenJson,
"Content-Type": "application/octet-stream",
"File-Name": imageName
},
description: "{ 'uploading': " + imageName + " }"
};
return this.session.multipartUpload(params, request);
在 android 中,fileUri 以相当直接的方式返回:
takePictrue.then((imageAsset: ImageAsset) => {
那么imageAsset.android
就有了发送图片所需的文件uri。但是,对于 ios,imageAsset.ios
是一个 PHAsset。要获取文件 URI,我使用以下代码:
let manager = PHImageManager.defaultManager()
let options = new PHImageRequestOptions();
options.resizeMode = PHImageRequestOptionsResizeMode.Exact;
options.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
manager.requestImageForAssetTargetSizeContentModeOptionsResultHandler(imageAsset.ios, { width: 2048, height: 1536 }, PHImageContentModeAspectFill, options, function (result, info) {
让 srcfilePath = info.objectForKey("PHImageFileURLKey").toString();
...
});
在上面:srcfilePath(我作为 fileUri 传递)是:file:///var/mobile/Media/DCIM/101APPLE/IMG_1902.JPG
那么图片名称就是IMG_1902.JPG
但是,这会上传一个空文件。我猜我需要更改 fileUri 或者我应该使用不同的方法来:requestImageForAssetTargetSizeContentModeOptionsResultHandler
。
我已经尝试了 here 建议的解决方案:
let fileUri = image.fileUri.replace("file://","");
我试过更改 MIME 类型 "mimeType":"image/jpg"
。
非常感谢任何想法。
山姆,这可能有帮助。我执行了以下操作来处理 iOS 用户从他们的图库中选择一张照片以供稍后在应用程序中使用(Android 就像您的情况一样简单明了,但是 iOS returns PHAsset):
import { ImageSource } from "image-source";
import { Image } from "tns-core-modules/ui/image";
import { path, knownFolders } from "tns-core-modules/file-system";
//iOS user picks photo...
const iosImg = new ImageSource();
iosImg.fromAsset(myPHAsset).then(imsr => {
this.counter += 1; //class property to allow unique filenames
const folder = knownFolders.documents();
const path2 = path.join(folder.path, `Image${this.counter}.jpg`);
const saved = imsr.saveToFile(path2, "jpg");
const img = new Image();
img.src = path2;
this.data.changeImage(img); //Ng service to allow use of image in other components
});
链接:{N} docs
我可以使用 nativescript-camera
和 nativescript-background-http
将 android 上的文件上传到 C# web api。
我将参数设置如下:
var params = [{ name: "image", filename: fileUri, mimeType: 'application/octet-stream' }];
...
并发送请求:
let request = {
url: this.API_URL + "/UploadOctetFile",
method: "POST",
headers: {
"Authorization": accessTokenJson,
"Content-Type": "application/octet-stream",
"File-Name": imageName
},
description: "{ 'uploading': " + imageName + " }"
};
return this.session.multipartUpload(params, request);
在 android 中,fileUri 以相当直接的方式返回:
takePictrue.then((imageAsset: ImageAsset) => {
那么imageAsset.android
就有了发送图片所需的文件uri。但是,对于 ios,imageAsset.ios
是一个 PHAsset。要获取文件 URI,我使用以下代码:
let manager = PHImageManager.defaultManager()
let options = new PHImageRequestOptions();
options.resizeMode = PHImageRequestOptionsResizeMode.Exact;
options.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
manager.requestImageForAssetTargetSizeContentModeOptionsResultHandler(imageAsset.ios, { width: 2048, height: 1536 }, PHImageContentModeAspectFill, options, function (result, info) { 让 srcfilePath = info.objectForKey("PHImageFileURLKey").toString(); ... });
在上面:srcfilePath(我作为 fileUri 传递)是:file:///var/mobile/Media/DCIM/101APPLE/IMG_1902.JPG
那么图片名称就是IMG_1902.JPG
但是,这会上传一个空文件。我猜我需要更改 fileUri 或者我应该使用不同的方法来:requestImageForAssetTargetSizeContentModeOptionsResultHandler
。
我已经尝试了 here 建议的解决方案:
let fileUri = image.fileUri.replace("file://","");
我试过更改 MIME 类型 "mimeType":"image/jpg"
。
非常感谢任何想法。
山姆,这可能有帮助。我执行了以下操作来处理 iOS 用户从他们的图库中选择一张照片以供稍后在应用程序中使用(Android 就像您的情况一样简单明了,但是 iOS returns PHAsset):
import { ImageSource } from "image-source";
import { Image } from "tns-core-modules/ui/image";
import { path, knownFolders } from "tns-core-modules/file-system";
//iOS user picks photo...
const iosImg = new ImageSource();
iosImg.fromAsset(myPHAsset).then(imsr => {
this.counter += 1; //class property to allow unique filenames
const folder = knownFolders.documents();
const path2 = path.join(folder.path, `Image${this.counter}.jpg`);
const saved = imsr.saveToFile(path2, "jpg");
const img = new Image();
img.src = path2;
this.data.changeImage(img); //Ng service to allow use of image in other components
});
链接:{N} docs