Access a file which is located before / outside the server root directory?

我的未来我决定 提交于 2019-11-27 08:43:49

You cannot directly access any file outside your web directory. As your question includes the tag PHP as well, I assume you may want to use it.

What you can do is the following:

Inside your www directory, create a "image.php" file, with a similar content to:

<?php
  header('Content-Type: image/png');
  readfile("../img/" . $_GET['img']);
?>

And call your images with

<img src="image.php?img=myimage.png" />

Please be aware that your PHP file shouldn't be that simple :) As you may want to address multiple image formats (and providing the correct header for them), checking for malicious file path/inclusions (you don't want to use $_GET without validating/sanitizing the input), extra caching etc. etc. etc.

But this should give you an idea on how you can target your issue.

It depends on what you are trying to accomplish and how. With "simple" html commands it is as you found out. You can't go to a directory outside of the www root. (for xampp applications on C for exmple it is most of the time c:\xampp\htdocs).

If you are ok with using serverside commands to accomplish what you want to achieve then you could use php to do a workaround, by reading the appropriate files in via PHP. For example if your file is named "myimg.gif" and lies in "c:\pics"

<img SRC="data:image/gif;base64,<?php echo base64_encode(file_get_contents("c:\pics\myimg.gif"));?>">

With that you are reading the contents of the file and writing it directly into the img tag. Be aware that you need to change image/gif to what you really need there.

You can't directly access file outside/above your root directory (www or public_html).

You can create virtual directory in Apache server configuration. Google "apache virtual directory" for more information.

Virtual directory configuration example:

<IfModule alias_module>
  Alias /uploaded_images/ "/home/someuser/somewhere"
  <Directory "/home/someuser/somewhere">
    Allow from all
  </Directory>
</IfModule>

uploaded_images directory will be available from web like normal directory in www directory. You can copy files from there to another location (kind of buffering).

You can also open/copy that file by ftp from php level without changing anything in apache, but this may be really slow (use it only if you can't control apache config, virtual directory is much better).

php.net: FTP

Jefri P.

I Agree with @kamil's idea about creating a virtual directory. However if you want to go the php route, I wrote some code that open's images in a directory before WWW and copies them to the www/images folder.

<?php 
$imagepath = "../images/";
define('IMGPATH', realpath($imagepath).DIRECTORY_SEPARATOR);
$cachewwwimg = "images/";
$imagename = 'image.jpg';
copy(IMGPATH.$imagename, $cachewwwimg.$imagename)
?>

<img src="<?php echo $cacheimg.$imagename;?>"/>
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!