当前位置: 首页 > 知识库问答 >
问题:

ionic 3不使用文件、文件传输、文件上传插件从相机上传图像

刁英朗
2023-03-14

我想使用FormData将图像上传到我的后端,但由于Ionic DEVAPP和Ionic VIEW不支持文件、文件传输和文件上传插件,我只需要使用Angular Http或HttpClient即可。

当使用DestinationType.FILE_URI时,我可以从文件中获取内部url并将其显示在img对象上,但如果没有本机文件、文件路径和文件传输插件,我无法从该url创建打字脚本文件对象。

getImage() {
const options: CameraOptions = {
  quality: 100,
  destinationType: this.camera.DestinationType.FILE_URI,
  sourceType: this.camera.PictureSourceType.PHOTOLIBRARY
}

this.camera.getPicture(options).then((imageData) => {
  this.imageURI =  this.sanitizer.bypassSecurityTrustUrl(imageData)
}, (err) => {
  console.log(err)
  this.presentToast(err)
})

}

使用此模板

<ion-content padding>
  <ion-item>
    <p>{{imageFileName}}</p>
    <button ion-button color="secondary" (click)="getImage()">Get Image</button>
  </ion-item>
  <ion-item>
    <h4>Image Preview</h4>
    <img style="display:block" [src]="imageURI" *ngIf="imageURI" alt="Ionic File" width="300" />
  </ion-item>
  <ion-item>
    <button ion-button (click)="uploadFile()">Upload</button>
  </ion-item>
</ion-content>

使用DestinationType时。DATA_URL我可以显示图像,但无法使用原始文件名创建所需的typescript文件对象,以便将图像附加到我的Ionic应用程序上载服务中使用的FormData。

似乎我可以找到一种方法来创建这个打字稿文件对象与原始文件名从FILE_URI和一个Base64编码数据从DATA_URL使用camera.get图片从科尔多瓦相机本机插件。

服务将文件上传到我的后端只是使用这种方法:

postImage(image: File): Observable<any> {
        const formData = new FormData()
        .append('file', image, image.name)
        }
        return this.httpClient.post<any>(this.myUrl,formData)
    }

两个getImage从组件myPage.ts和postImage从uploadservice.ts工作正常,但我不能找到一种方法来创建文件对象camera.getPicture ImageData

共有3个答案

巫马曜文
2023-03-14

我也有同样的问题,我喜欢这个和它的作品。但有一件事要注意,我没有首先显示所选的图像。上传后只可见。

openImage() {
const options: CameraOptions = {
  quality: 100,
  destinationType: this.camera.DestinationType.FILE_URI,
  sourceType: this.camera.PictureSourceType.PHOTOLIBRARY,
  correctOrientation: true,
  allowEdit: false
};

this.camera.getPicture(options).then(imageData => {
  this.ImageFile = imageData;
}, err => {
  this.commonProvider.showToast('Error occured while opening the image' + err);
});

}

upload(msg: string) {
this.businessProvider.upload(this.Id, this.ImageFile)
  .then(
    data => {
      let response = JSON.parse(data["response"]);
      if (response.code === '1') {
        this.commonProvider.showToast('Business successfully ' + msg);
        this.navCtrl.pop();
      } else {
        this.commonProvider.showToast(response.message);
      }
      this.commonProvider.dismissLoader();
    },
    error => {
      this.commonProvider.showToast(JSON.stringify(error));
      this.commonProvider.dismissLoader();
    }
  );

}

这是我的生意提供商

import { Injectable } from '@angular/core';
import { HttpClient, HttpErrorResponse } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import { ErrorObservable } from 'rxjs/observable/ErrorObservable';
import { catchError } from 'rxjs/operators';
import { Constant } from '../app/app.constants';
import { AuthenticationProvider } from '../providers/authentication';
import { FileTransfer, FileUploadOptions, FileTransferObject } from '@ionic-native/file-transfer';

@Injectable()
export class BusinessProvider {

  private actionUrl: string;

  constructor(
    private http: HttpClient,
    private auth: AuthenticationProvider,
    private constant: Constant,
    private transfer: FileTransfer
  ) {
    this.actionUrl = this.constant.getServerWithApiUrl() + 'Business/';
  }


  upload(Id: number, ImageFile): any {
    const fileTransfer: FileTransferObject = this.transfer.create();
    const headers = this.auth.getHeader();
    let options: FileUploadOptions = {
      fileKey: 'ionicfile',
      fileName: 'ionicfile.jpg',
      chunkedMode: false,
      mimeType: "image/jpeg",
      headers: { headers }
    }
    return fileTransfer.upload(ImageFile, this.actionUrl + 'Upload/' + Id, options);
  }

}
勾安翔
2023-03-14

答案主要取自此处,但适用于@ionic native/camera插件getPicture命令。

private urltoFile(url, filename, mimeType) {
    return (fetch(url)
        .then(function(res){return res.arrayBuffer();})
        .then(function(buf){return new File([buf], filename, {type:mimeType});})
    );
}

getPicture() {
    const options: CameraOptions = {
      quality: 50,
      destinationType: this.camera.DestinationType.DATA_URL,
      encodingType: this.camera.EncodingType.JPEG,
      mediaType: this.camera.MediaType.PICTURE,
      correctOrientation: true
    }

    this.camera.getPicture(options).then((imageData) => {

      let base64Image = 'data:image/jpeg;base64,' + imageData
      this.urltoFile(base64Image, 'filename.jpg', 'image/jpeg')
      .then((file) => {
          // You now have a file object that you can attach to a form e.g.
          this.myForm.get("imageToUpload").setValue(file)        
      })

    }, (err) => {
     // Handle error
    });
}

需要注意的关键点是

  1. 目标类型必须是DATA_URL
  2. 必须前置data: Image/jpeg; bas64,ImageData
吴修洁
2023-03-14

如果你不想使用本机插件,你可以使用angular。在这种情况下,使用离子输入文件:

<ion-input type="file"></ion-input>

剩下的就用角度:https://www.academind.com/learn/angular/snippets/angular-image-upload-made-easy/

您可以使用此示例:

https://github.com/diegogplfree/Ionic3-fileupload-non-native

亲切的问候。

 类似资料:
  • 本文向大家介绍asp.net文件上传解决方案(图片上传、单文件上传、多文件上传、检查文件类型),包括了asp.net文件上传解决方案(图片上传、单文件上传、多文件上传、检查文件类型)的使用技巧和注意事项,需要的朋友参考一下 小编之前也介绍了许多ASP.NET文件上传的解决案例,今天来个asp.net文件上传大集合。 1 使用标准HTML来进行图片上传 前台代码: 后台代码: 2 单文件上传 这是最

  • 在Yii里上传文件通常使用 yii\web\UploadedFile 类, 它把每个上传的文件封装成 UploadedFile 对象。 结合 yii\widgets\ActiveForm 和 models,你可以轻松实现安全的上传文件机制。 创建模型 和普通的文本输入框类似,当要上传一个文件时,你需要创建一个模型类并且用其中的某个属性来接收上传的文件实例。 你还需要声明一条验证规则以验证上传的文件

  • 大多数的 Web 应用都不可避免的,会涉及到文件上传。文件上传,不过是一种适配 HTTP 输入流的方式。 为此,Nutz.Mvc 内置了一个专门处理文件上传的适配器 org.nutz.mvc.upload.UploadAdaptor 这个适配器专门解析形式为 <form target="hideWin" enctype="multipart/form-data" method="post">

  • 哦,上传文件可是个经典的好问题了。文件上传的基本概念实际上非常简单, 他基本是这样工作的: 一个 <form> 标签被标记有 enctype=multipart/form-data ,并且 在里面包含一个 <input type=file> 标签。 服务端应用通过请求对象上的 files 字典访问文件。 使用文件的 save() 方法将文件永久地 保存在文件系统上的某处。 一点点介绍 让我们建立一

  • Django提供了一些类实现管理数据分页,这些类位于django/core/paginator.py中 Paginator对象 Paginator(列表,int):返回分页对象,参数为列表数据,每面数据的条数 属性 count:对象总数 num_pages:页面总数 page_range:页码列表,从1开始,例如[1, 2, 3, 4] 方法 page(num):下标以1开始,如果提供的页码不存在

  • SDK 详细代码可参考sdk-java模块代码,位于单元测试文件中 /** * 上传文件,读取本地文件 * * @throws IOException */ @Test public void testUpload() throws IOException { FileUploadRequest request = new F