IOS 如何使用 nativescript-camera 和 nativescript-background-http 上传图片

How to upload an image with nativescript-camera and nativescript-background-http on IOS

我可以使用 nativescript-cameranativescript-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

{N} imagepicker #197

{N} imageUpload code