2010-11-25 33 views
2

J'écris une application obj-c et je voudrais télécharger un fichier binaire de quelques mégas en taille sur mon serveur appengine (python). Je devine que j'ai besoin d'utiliser l'entité blob pour cela, mais je ne sais pas comment y arriver. J'utilise des requêtes et des réponses http pour envoyer et recevoir des données jusqu'à maintenant, mais elles ont été encodées en chaînes. Quelqu'un peut-il conseiller comment je vais faire la même chose avec des blobs d'une application obj-c? Je vois quelques exemples qui impliquent des demandes de HTTP mais ils semblent orientés vers la page Web et je ne suis pas très familier avec lui. Y a-t-il des tutoriels décents ou des solutions pas à pas?en utilisant des blobs appengine pour les données binaires dans une application d'obj-c

Je ne suis pas complètement sûr, si je suis supposé l'encoder dans la requête http et le renvoyer par la réponse, comment obtenir les données binaires dans la chaîne HTTP du client et comment l'envoyer revenir correctement du serveur lors du téléchargement de mes données binaires. Je pense peut-être que l'approche doit être totalement différente de ce que je suis habitué à l'encodage des valeurs dans ma demande dans le format param1 = val & param2 = val2 mais incertain.

Dois-je utiliser le service blobstore pour cela? Une remarque importante est que j'ai entendu dire qu'il y a une limite de 1 mégaoctets sur les blobs, mais j'ai des fichiers audio de 2 à 3 méga-octets que je dois stocker (au moins 1,8 mégaoctet).

Répondre

2

J'ai récemment dû faire quelque chose de similaire, bien que ce soit des données binaires sur une connexion socket. Au client utilisant XML, au serveur en tant que flux de données. J'ai fini par encoder en base64 les données binaires lors de l'envoi en arrière. C'est un peu bavard mais surtout du coté client ça rend les choses plus faciles à gérer, pas de caractères spéciaux à s'inquiéter dans mon XML. Je l'ai ensuite traduit avec NSData dans un vrai format binaire. J'ai utilisé this code pour faire l'encodage et le décodage, chercher "cyrus" pour trouver l'extrait que j'ai utilisé, il y en a quelques-uns qui fonctionneraient ici.

Dans votre cas, je remplacerais votre requête http par un appel de données au lieu de tout mettre dans l'URL. Si vous n'êtes pas sûr de la différence, regardez here.

Je ne suis pas aussi familier avec python, mais vous pouvez essayer here pour obtenir de l'aide à cette fin.

Espérons que ça aide. Éditer - il semble que les blobs sont la voie à suivre. Jetez un oeil à this link pour le type chaîne/blob ainsi que this link pour plus d'informations sur le travail avec le blob.

+0

Je suppose également que vous avez la possibilité de l'encoder/décoder avec le serveur appengine, mais je ne l'ai jamais utilisé donc je suppose que cela peut être hors de la fenêtre si ce n'est pas le cas. Si vous ne pouvez pas le stocker comme un blob serait mieux que de l'encoder et de le stocker sous forme de texte. – slycrel

+0

merci pour le plomb sur les choses. Je vérifierai. Je suis assez certain que je dois utiliser des blobs en raison des limites de taille sur les autres types d'objets (toujours pas confirmé). Je mettrai à jour mon article original pour le mentionner. – Joey

+0

Juste pris quelques minutes et regardé l'API Appengine certains. Je mettrai à jour ma réponse avec quelques liens, mais il semble que vous devriez déjà avoir les outils disponibles sur google, et utiliser les blobs. De plus, il semble que la taille limite d'un blob soit de 1 Mo. – slycrel

0

Il y a trois questions en une ici:

  1. Si vous utilisez un blob pour les données binaires?
  2. Comment les données postez-vous binaires, et l'utiliser à partir du moteur app
  3. Comment récupérer des données binaires de moteur app

Je ne peux pas répondre si vous « devriez » blobs utilisation, seulement vous connaître la réponse à cela, et cela dépend beaucoup du type de données que vous essayez de stocker, et comment il va être utilisé. Prenons une image par exemple (qui est probablement le cas d'utilisation le plus populaire pour cela). Vous souhaitez que les utilisateurs prennent une photo avec leur téléphone, la téléchargent et la partagent avec d'autres utilisateurs. C'est une bonne utilisation des blobs, mais comme @slycrel suggère que vous rencontrerez des limitations sur la taille de l'enregistrement. Cela peut être réalisable, par exemple vous pouvez utiliser la bibliothèque d'images python (pil) pour réduire la taille de l'image. Pour afficher des données binaires, voir this question. Il serait préférable de mettre en cache 2 copies, une vignette et une taille complète.De cette façon, le redimensionnement doit seulement se produire une fois, lors du téléchargement. Si vous voulez aller mieux, vous pouvez utiliser la nouvelle fonction d'arrière-plan du moteur de l'application pour mettre en file d'attente le traitement de l'image pour plus tard. Dans tous les cas, vous devrez renvoyer l'identifiant du blob nouvellement créé afin de pouvoir le référencer à partir de l'appareil sans requête http supplémentaire.

Pour récupérer des données, je pense que la meilleure approche serait de traiter le BLOB comme sa propre ressource. Ajustez vos itinéraires de sorte que toute blob donnée a une URL unique:

http://myweb/images/(thumbnail|fullsize)/<blobid>.(jpg|png|gif) 

Où BLOBID est dynamique, et peut être utilisé JPG, PNG ou GIF pour obtenir le type d'image. Thumbnail ou fullsize peuvent être utilisés pour récupérer la version plus petite ou plus grande que vous avez enregistrée lors de sa publication.