5 votes

Comment lire un fichier image dans le répertoire des documents à partir d'une vue Web d'ios ?

Je télécharge le fichier image et l'écris dans le répertoire des documents comme ci-dessous :

NSArray   *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString  *documentsDirectory = [paths objectAtIndex:0];

NSString  *objURL = @"http://test.test.com/file/image.png";
NSURL     *objurl = [NSURL URLWithString:objURL];
NSData    *imgData = [NSData dataWithContentsOfURL:objurl];

NSString *imgFile = [NSString stringWithFormat:@"%@/%@", documentsDirectory,@"image.png"];
[imgData writeToFile:imgFile atomically:YES];

Dans mon webView, j'ai chargé un fichier html depuis ma ressource bundle pour l'utiliser dans mon webView, mais comment faire pour que la balise dans le html lise l'image.png dans le répertoire documents ?

<html>
<body>
    <img src="../what/is/the/path/to/use/image.png" />
</body>
</html>

2voto

Wayne Hartman Points 8701

Vous pourriez donner l'URL de cette image en utilisant un chemin d'accès absolu avec une balise file:// schéma :

NSString *documentsDirectory = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES)[0];
NSString *filePath = [NSString stringWithFormat:@"file://%@/image.png", documentsDirectory];

Vous pourriez alors exécuter un javascript pour mettre à jour le src pour le mettre à jour avec le nouveau chemin :

NSString *javascript = [NSString stringWithFormat:@"var imageElement = document.getElementById('localFile'); imageElement.setAttribute('src', '%@');", filePath];
[self.webView stringByEvaluatingJavaScriptFromString:javascript];

Dans votre HTML, le chemin ressemblerait à quelque chose comme :

<html>
    <body>
        <img id="localFile" src="file:///var/mobile/Applications/3D7D43E8-FA5E-4B19-B74C-669F7D1F3093/Documents/image.png" />
    </body>
</html>

2voto

Kjuly Points 15089

Au lieu d'évaluer le JavaScript, j'écris simplement un placeholder dans mon contenu html, et je le remplace directement par le contenu nécessaire :

NSString *htmlFilePath = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"html"];
NSString *htmlString = [NSString stringWithContentsOfFile:htmlFilePath encoding:NSUTF8StringEncoding error:&error];
if (error) {
  // handle error
  return;
}

NSString *imageFilePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"sample_image.png"];
NSURL *imageFileURL = [NSURL fileURLWithPath:imageFilePath];
NSString *sampleImageReplacement =
  [NSString stringWithFormat:@"<img src=\"%@\" />", [imageFileURL absoluteString]];

// Replace the placeholder w/ real content,
//   and of course, we can also replace it w/ empty string
//   if the image cannot be found.
htmlString = [htmlString stringByReplacingOccurrencesOfString:@"%sample_image%"
                                                   withString:sampleImageReplacement];
...
[webView loadHTMLString:htmlString baseURL:nil];

1voto

HDA Points 2590

Vous pouvez charger les images à partir du paquet d'applications mais vous ne pouvez pas charger les images à partir du répertoire des documents directement.

Mais il existe une solution de contournement.

Utilisez CocoaHTTPServer pour créer un InAppHttpServer et vous pouvez accéder aux images dans le répertoire des documents en utilisant l'URL http dans la vue web.

ou bien

Convertissez l'image en base64 et chargez l'image en utilisant evaluatejavascript de webview

document.getElementById('img').setAttribute( 'src', 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==' );

0voto

Apurv Points 9148

Vous ne pouvez pas lier la source de l'image dès le début. Vous devrez le faire via JavaScript.

Vous devez passer le chemin de l'image à UIWebView en évaluant le JS. Ici, vous pouvez passer le chemin de votre image et le JS chargera l'image dans la balise HTML correspondante.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X