Téléchargement de fichier image via l'API à l'aide de Symfony2 & amp; FOSRESTBundle
J'ai été codage d'une API pour une application de partage de photos comme Instagram en utilisant Symfony2, FOSRESTBundle, et Vichuploader pour les uploads de fichier.
Je suis capable de travailler autour de GET et POST demandes, mais je ne peux pas trouver un exemple de comment assortir une requête POST, l'image réelle de sorte que, dans mon cas, Vichuploader peut s'en emparer et de m'aider à sortir de l'upload de fichier.
Par le chemin, je peux télécharger un fichier sans problème à l'aide de la pile mentionné par l'utilisation d'une forme normale.
source d'informationauteur MoonwalkerHN | 2013-06-16
Vous devez vous connecter pour publier un commentaire.
J'ai été à la recherche d'une solution sur exactement le même problème. Voici ce que j'ai fait.
D'abord, permettez-moi de vous expliquer mes contraintes. Je voulais que mon API pour être complet JSON et à prendre le pouvoir dans le protocole HTTP (en-têtes, des méthodes, etc.). J'ai choisi d'utiliser:
Première solution envisagée: base64
Ma première pensée, parce que je pensais JSON à chaque fois, était de coder toutes les images en base64, puis les décoder à l'intérieur de mon API et de les stocker.
L'avantage de cette solution est que vous pouvez passer des images avec d'autres données. Par exemple télécharger l'ensemble du profil de l'utilisateur dans un appel d'API. Mais j'ai lu que le codage d'images en base64 les faire croître de 33% de leur taille initiale. Je n'ai pas envie que mes utilisateurs à forfait de données mobiles après l'envoi de 3 images.
Deuxième solution envisagée: forme
Puis j'ai pensé à l'aide de formes, comme indiqué ci-dessus. Mais je ne sais pas comment mes clients pourrait envoyer à la fois des données JSON (par exemple
{"last_name":"Litz"}
) et des données d'image (par exempleimage/png
). Je sais que vous pouvez traiter avec unContent-Type: multipart/form-data
mais rien de plus.Plus je n'étais pas à l'aide de formulaires dans mon API depuis le début et je voulais qu'il soit uniforme dans tout mon code. [mini-edit: hoho, quelque chose que je viens de découvrir, ici]
Troisième et dernière solution: utiliser HTTP..
Puis, une nuit, la révélation. Je suis en utilisant
Content-Type: application/json
pour envoyer des données JSON. Pourquoi ne pas utiliserimage/*
pour envoyer des images? Tellement facile que j'ai cherché pendant des jours avant de venir avec cette idée. C'est la façon dont je l'ai fait (simplifié de code). Supposons que l'utilisateur appellePUT /api/me/image
avec unContent-Type: image/*
UserController::getUserImageAction(Request $request) - la Capture de la Demande
UserImageService::updateUserImage($utilisateur, $contenu) - de la Logique Métier (j'ai tout mis ici pour être plus simple à lire)