Quel est le path des fichier dans une application?

yodarkyodark Membre
14:56 modifié dans API UIKit #1
Bonjour à  tous...

Petite question ! quel est l'URL des fichiers locaux d'une application ?
Je m'explique si j'ai une webView dans mon application et que je veux afficher une image qui se trouve dans l'application quel URL je dois utiliser ?

exemple sur pc je ferais <img src="C:/mondosier/monimage.jpg">

Réponses

  • Philippe49Philippe49 Membre
    septembre 2008 modifié #2
    Dans le code :

    NSBundle * mainBundle=[NSBundle mainBundle];
    NSString * path=[mainBundle pathForResource:@monimage oftype:@jpg];
    NSURL * url=[NSURL fileURLWithPath:path];
  • CéroceCéroce Membre, Modérateur
    septembre 2008 modifié #3
    (Non rien, ma réponse est hors sujet.)
  • ChachaChacha Membre
    14:56 modifié #4
    Si tu fais "clic-droit" sur une application, tu verras qu'en réalité, une application est un dossier. De plus, elle respecte une structure interne bien défine, avec les exécutables à  un endroit, les frameworks embarqués à  d'autres, les "ressources" (images, sons, fichiers tiers...) encore à  d'autres.
    Cette structure est créés pour toi à  partir de ton projet XCode. Par exemple, ce que tu mets dans le groupe "Resources" du projet XCode, et qui se retrouve dans l'étape "Copy Bundle Resources" de ta cible (target) principale, sera bien embarqué dans le sous-dossier "Resources" de ton application.

    Quand bien même on connaà®t la structure interne d'un .app, on ne veut quand même pas écrire les chemins en dur. D'abord, il y a les resources "localisées" (dépendant de la langue actuelle) qui compliquent le tout, et puis ce ne serait pas assez souple. On délègue donc cela aux bonnes APIs.

    Comme le dit Philippe49, un dossier "planqué derrière l'apparence d'un fichier" comme l'est un .app est un Bundle; on se tourne donc vers la classe NSBundle. mainBundle permet d'obtenir le bundle de l'application elle-même.
    Ensuite, des méthodes comme pathForResource:ofType: sont utilisables.

    Astuce : la méthode imageNamed: de NSImage permet de récupérer les images du mainBundle, avec gestion d'un cache mémoire, sans avoir à  utiliser NSBundle directement.

    +
    Chacha
  • yodarkyodark Membre
    14:56 modifié #5
    Donc si je comprends bien ce que vous me dites en faisant la commande postée par Philippe j'obtiendrais une url que je peux afficher... puis copier dans mes pages web ainsi cet URL pointera sur mes images en local ! Mais donc toute personne utilisant mon application aura le même chemin?
  • NoNo Membre
    septembre 2008 modifié #6
    dans 1220424709:

    Donc si je comprends bien ce que vous me dites en faisant la commande postée par Philippe j'obtiendrais une url que je peux afficher... puis copier dans mes pages web ainsi cet URL pointera sur mes images en local ! Mais donc toute personne utilisant mon application aura le même chemin?

    Non. Philippe n'a pas compris ton besoin.

    Le chemin que tu as mis dans le tag <img> est une aberration, même sous Windows.
    Si tu veux mettre un chemin local dans une url, il faut préciser le protocole (ici file://), ensuite, tu y colles le reste du chemin tel que retourné par NSURL (voir post Philippe).

    Cela devrait donner quelque chose comme : <img src="file:///le/chemin/vers/mon.fichier">
  • Philippe49Philippe49 Membre
    14:56 modifié #7
    dans 1220424709:

    Donc si je comprends bien ce que vous me dites en faisant la commande postée par Philippe j'obtiendrais une url que je peux afficher... puis copier dans mes pages web ainsi cet URL pointera sur mes images en local ! Mais donc toute personne utilisant mon application aura le même chemin?


    Si l'image est copiée en ressource dans ton projet, elle sera dans le bundle de l'application, chez tout utilisateur de ton application.
    Maintenant pour la charger dans une WebView, il suffit d'utiliser l'une des méthodes de chargement  comme par exemple loadResource: ofType:

    Ce n'est pas nécessaire d'écrire un code html !
  • Philippe49Philippe49 Membre
    14:56 modifié #8
    De plus, la définition du path par
        NSPath * path=[mainBundle pathForResource:@monimage oftype:@jpg];
    est dynamique, obtenue à  l'exécution et non à  la compilation.
    Cela veut dire que le path sera celui correspondant à  la machine sur laquelle le code est exécuté.

    Si je le fais exécuter chez moi, ce path est
    /Users/Philippe49/desktop/MonAppli.app/Contents/Resources/monimage.jpg

    Si tu le fais exécuter chez toi, c'est
    /Users/yodark/..../MonAppli.app/Contents/Resources/monimage.jpg

    C'est ce que t'expliques Chacha dans son post.
  • yodarkyodark Membre
    14:56 modifié #9
    ah donc comment faire si ma page est une page qui se trouve sur le web et que j'aimerais charger une image locale? Ca n'est pas possible ? Ou alors envoyer l'adresse local a un serveur php pour qu'il reconvertisse dynamiquement l'adresse?
  • laurrislaurris Membre
    14:56 modifié #10
    Si tu ne donne que l'URL de l'image au serveur distant, il faut que ce serveur puisse se connecter au client pour récupérer l'image à  partir de l'adresse. Donc il faut que le client soit aussi serveur. Si c'est pour une utilisation avec un iPhone , ça me parait pas possible.

    La seule solution que je vois, c'est d'uploader l'image sur le serveur. je n'ai pas essayé mais j'ai vu beaucoup de messages à  ce propos sur les forums iPhone. Je te conseille d'aller voir vers http://www.iphonedevsdk.com/forum/iphone-sdk-development.
  • yodarkyodark Membre
    14:56 modifié #11
    En fait il ne s'agit pas d'uploader une image

    J'ai pas été assez clair, je me ré explique

    J'ai une page qui se trouve sur internet adaptée a l'iphone, je l'affiche depuis mon application via une webView (par exemple comme cydia qui affiche http://cydia.saurik.com/)
    Mais afin de ne pas consommer de la bade passante 3G EDGE ou autre je ne télécharge pas les images parce qu'elles sont déja dans mon application.
    Du coup si j'ai les CSS et les images de mon site en local la bande passante utilisée est moindre seul le HTML brut et téléchargé depuis le web
  • septembre 2008 modifié #12
    dans 1220528840:

    En fait il ne s'agit pas d'uploader une image

    J'ai pas été assez clair, je me ré explique

    J'ai une page qui se trouve sur internet adaptée a l'iphone, je l'affiche depuis mon application via une webView (par exemple comme cydia qui affiche http://cydia.saurik.com/)
    Mais afin de ne pas consommer de la bade passante 3G EDGE ou autre je ne télécharge pas les images parce qu'elles sont déja dans mon application.
    Du coup si j'ai les CSS et les images de mon site en local la bande passante utilisée est moindre seul le HTML brut et téléchargé depuis le web



    Analyse ton code HTML et récupère tous les <img src=""> afin de récupérer les URL des images, et donc leur nom + extension. Avec ça tu remplaces tout les chemins des images par les chemins qui mènent vers celles de ton application. Tu charges le nouveau NSString qui correspond à  la source HTML de ta nouvelle page dans la webview et le tour est joué.

    En plus la source HTML de la page est chargée bien avant que le contenu de la webview soit chargé, donc tu peux récupérer le code HTML de la page sans la charger en fait.

    Une fois que tu as récupéré le code HTML de la page tu peux faire :
    <br />NSString* HTMLSource = codeHTML;<br />NSArray* extensionsArray = [NSArray arrayWithObjects:@&quot;jpg&quot;,@&quot;jpeg&quot;,@&quot;png&quot;,@&quot;gif&quot;,nil];<br />	<br />	NSArray* imgComponents = [HTMLSource componentsSeparatedByString:@&quot;&lt;img src=&#092;&quot;&quot;];<br />	NSMutableArray* URLs = [NSMutableArray array];<br />	<br />	// on récupère les URL des images<br />	NSEnumerator* e = [imgComponents objectEnumerator];<br />	id component;<br />	while(component=[e nextObject]){<br />		NSString *imgPath = nil;<br />		NSArray *subcomponents = [component componentsSeparatedByString:@&quot;&#092;&quot;&gt;&quot;];<br />		if([subcomponents count]&gt;0)<br />			if([extensionsArray containsObject:[[[subcomponents objectAtIndex:0] pathExtension] lowercaseString]])<br />				imgPath=[subcomponents objectAtIndex:0];<br />		<br />		if(imgPath!=nil)<br />			[URLs addObject:imgPath];<br />	}<br />	<br />	// On énumère les URLs des images pour les remplacer par celles de notre application<br />	e = [URLs objectEnumerator];<br />	id url;<br />	while(url = [e nextObject]){<br />		NSString* path=[[NSBundle mainBundle] pathForResource:[[url lastPathComponent] stringByDeletingPathExtension] ofType:[url pathExtension]];<br />		NSURL * newURL=[NSURL fileURLWithPath:path];<br />		<br />		HTMLSource = [HTMLSource stringByReplacingOccurrencesOfString:url withString:[newURL path]];<br />	}<br /><br />// Il ne reste plus qu&#39;à  charger le nouveau code HTML : &quot;newHTMLSource&quot; dans la webview<br />
    


    Bon j'ai pondu le code comme ça alors peut-être que ça marchera pas... j'ai fait au felling.
  • 14:56 modifié #13
    Bon ben j'ai eu good :D

    Je t'ai attaché un projet d'exemple dans le message.
  • yodarkyodark Membre
    14:56 modifié #14
    hey merci beacoup pour cette source !
  • yodarkyodark Membre
    14:56 modifié #15
    juste une petite question encore !
    Quel est le requirement de NSPath parce que chez moi il ne reconnait pas la commande ?
  • 14:56 modifié #16
    dans 1220542140:

    juste une petite question encore !
    Quel est le requirement de NSPath parce que chez moi il ne reconnait pas la commande ?

    Utilise NSString comme dans mon code. NSPath n'existe pas.
  • AliGatorAliGator Membre, Modérateur
    14:56 modifié #17
    Heu en fait c'est juste une erreur de Philippe49, il fallait lire NSString et pas NSPath.
    En effet [tt]pathForResource:ofType:[/tt] retourne bien une NSString... donc c'est bien NSString qu'il faut mettre pour le type de la variable ;)

    [EDIT]Arg j'avais pas vu la 2e page et la réponse de Louka :P[/EDIT]
  • 14:56 modifié #18
    Héhé  ;)

    Par contre je comprend pas trop l'intérêt. Pourquoi tu cherches à  faire ça exactement ? C'est juste par simple curiosité que je demande, t'es pas obligé de répondre  :P
    (Moi j'aurai carrément inclu la page HTML ds le projet avec les images & css)
  • yodarkyodark Membre
    14:56 modifié #19
    C'est très simple j'ai tout un système complexe qui est géré en PHP. Si je veux le porter sur iphone, soit je fais une application web lourde, ou soit je fais une version SDK ou toutes les informations lourdes sont en local (image javascript css) ce qui a l'avantage d'être très rapide (uniquement quelques informations serveur a récupérer)
Connectez-vous ou Inscrivez-vous pour répondre.