?
Solved

Header/readfile does not work when trying to display image outside of website root

Posted on 2013-01-01
8
Medium Priority
?
355 Views
Last Modified: 2013-01-04
Hi,

I'm using this code to open an image saved outside of web root (home/kenneth/uploads/...)
It works fine in both IE and FF, but it does not work in Chrome - it just keep loading.

# Set headers
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=".$file['original_filename']);
header("Content-Type: application/octet-stream");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($absolute_path));

ob_clean();
flush();

# Read the file from disk
readfile($absolute_path);

Open in new window

$file['download_path'] = "http://".$file['hostname']."/download.php?token=".$token;

<img style="margin: 15px; max-width: 870px" src="<?php echo $file['download_path']; ?>" alt="<?php echo $file['original_filename']; ?>" />

Open in new window

0
Comment
Question by:kgp43
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 4
8 Comments
 
LVL 111

Expert Comment

by:Ray Paseur
ID: 38734458
What are you trying to accomplish?  Is it to render an image in the browser viewport or force a download?
0
 

Author Comment

by:kgp43
ID: 38734481
Display an image located outside public_html

Ex.

<img src="/photo.php?fileid=xxxx" />

Photo.php

# Set headers
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=".$file['original_filename']);
header("Content-Type: application/octet-stream");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($absolute_path));

ob_clean();
flush();

# Read the file from disk
readfile($absolute_path);

Open in new window


The image appear correctly in both Firefox and IE, but not in Chrome. Chrome just keep loading, no image appears.
0
 
LVL 111

Expert Comment

by:Ray Paseur
ID: 38734528
You may have a lot more headers than you need.  This article describes how I do it.
http://www.experts-exchange.com/Web_Development/Web_Languages-Standards/PHP/A_10065-Adding-a-Watermark-to-an-Image.html

IIRC the only header you really need is Content-type
0
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 111

Expert Comment

by:Ray Paseur
ID: 38734531
I am also a little suspicious of this.  Why do you use that function?
http://php.net/manual/en/function.ob-clean.php
0
 

Author Comment

by:kgp43
ID: 38734588
Hi Ray,

Does not matter what I do, nothing loads in Chrome for me.
http://fs01.imgdrive.com/download.php?token=3L9QZB

header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=".$file['original_filename']);
header('Content-Type: '.$file['mimetype']);

# Read the file from disk
readfile($absolute_path);

Open in new window


I removed ob_flush and cleaned up the headers. Seems I need the extra two or it's not possible to save the image with original filename when right-clicking (save as).
0
 

Author Comment

by:kgp43
ID: 38734610
More error checking.
http://fs01.imgdrive.com/test.php

$absolute_path = "/home/fs01/uploads/2012/12/31/v3hbspfc9d_image.jpg";

header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=".basename($absolute_path));
header('Content-Type: application/octet-stream');

# Read the file from disk
readfile($absolute_path);

Open in new window


Seems the code above start image download.
Going to see if the rest works with it.
0
 

Author Comment

by:kgp43
ID: 38734647
Works not, not sure what the problem was.

header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=".basename($absolute_path));
header('Content-Type: '.$file['mimetype']);

# Read the file from disk
readfile($absolute_path);

Open in new window

0
 
LVL 111

Accepted Solution

by:
Ray Paseur earned 2000 total points
ID: 38734694
Probably just getting rid of the inappropriate headers like Application/Octet Stream was all that was needed.
0

Featured Post

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

These days socially coordinated efforts have turned into a critical requirement for enterprises.
Originally, this post was published on Monitis Blog, you can check it here . In business circles, we sometimes hear that today is the “age of the customer.” And so it is. Thanks to the enormous advances over the past few years in consumer techno…
The viewer will learn how to count occurrences of each item in an array.
This tutorial will teach you the core code needed to finalize the addition of a watermark to your image. The viewer will use a small PHP class to learn and create a watermark.
Suggested Courses

764 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question