J'essaie de publier des données de formulaire, consistant en un fichier texte et image sur le serveur PHP. J'utilise une caméra native ionique pour obtenir une photo de la galerie:
var headers = new Headers();
headers.append('Content-Type', 'multipart/form-data;boundary=' + Math.random());
headers.append('Accept', 'application/json');
let options = new RequestOptions({
headers: headers
});
let formData = new FormData();
formData.append('judul', this.judul.value);
formData.append('photo', this.myphoto, '123.jpg');
this.http.post('http://localhost/upload.php', formData, options)
.map(...)
.subscribe(...);
Et la publier en utilisant les données du formulaire:
const options: CameraOptions = {
quality: 70,
destinationType: this.camera.DestinationType.FILE_URI,
sourceType: this.camera.PictureSourceType.PHOTOLIBRARY,
saveToPhotoAlbum:false,
targetWidth: 400,
targetHeight: 400
}
this.camera.getPicture(options).then((imageData) => {
this.myphoto = normalizeURL(imageData);
this.myphoto2 = imageData;
}, (err) => {
});
Mais, j'ai vu sur Journal PHP, les données de formulaire non envoyées par ionic. Quel est le problème ici?
3 Réponses :
Vous pouvez essayer de supprimer 'options' des arguments this.http.post (). Votre code devient:
this.http.post (' http: //localhost/upload.php ', formData) .carte(...) .subscribe (...);
Si cela ne fonctionne pas, essayez d'envoyer sur toute l'image BASE64 en utilisant
'destinationType: this.camera.DestinationType.DATA_URL'
J'ai essayé l'option n ° 2, mais il semble que la chaîne base64 soit trop longue, elle génère donc une erreur.
Quelle erreur avez-vous rencontrée, les chaînes de base 64 ne peuvent jamais être trop longues, cela dépend de la taille du fichier? Quel était le poids du fichier?
Le post-processus n'est jamais terminé, suspendu à l'infini et ne renvoie rien.
la première option a-t-elle fonctionné pour vous? Je ne peux pas vraiment vous aider sans messages d'erreur.
Oui, parfois cela fonctionne, mais parfois non. Le message d'erreur est juste une connexion expirée.
stackoverflow.com/ questions / 3829403 /…
ne suggérerait à personne d'utiliser base64 pour publier des images ... cela ajoute 30% de la charge utile d'origine
Je vous conseille d'utiliser le plugin natif pour télécharger le fichier:
Commencez par prendre une photo depuis l'appareil photo
private readFile(file: any) {
const reader = new FileReader();
reader.onloadend = () => {
this.myphoto = new Blob([reader.result], {type: file.type});
var headers = new Headers();
headers.append('Content-Type', 'multipart/form-data;boundary=' + Math.random());
headers.append('Accept', 'application/json');
let options = new RequestOptions({
headers: headers
});
let formData = new FormData();
formData.append('judul', this.judul.value);
formData.append('photo', this.myphoto, '123.jpg');
this.http.post('http://localhost/upload.php', formData, options)
.map(...)
.subscribe(...);
};
reader.readAsArrayBuffer(file);
}
Ensuite, obtenez une URL d'image système locale
private getSystemURL(imageFileUri: any): void {
this.file.resolveLocalFilesystemUrl(imageFileUri)
.then(entry => (entry as FileEntry).file(file => {
this.readFile(file);
}))
.catch(err => console.log(err));
}
Après avoir lu cette URL d'image
async takePhoto() {
const options: CameraOptions = {
quality: 70,
destinationType: this.camera.DestinationType.FILE_URI,
sourceType: this.camera.PictureSourceType.PHOTOLIBRARY,
saveToPhotoAlbum:false,
targetWidth: 400,
targetHeight: 400
}
this.camera.getPicture(options).then((imageData) => {
this.getSystemURL(imageData);
}, (err) => {
});
}
Cela fonctionne pour moi, J'espère que cela aidera.