I have this php file:
<?php
$file = 'ico/people.gif';
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;
}
?>
This works.
But the line $file = 'ico/people.gif'; should be removed, and instead the script is to receive the url from another document.
This other document has this JavaScript in header:
<script>
function save_file(url){
document.location.href = "save.php?image="+url;
}
</script>
And this button in body:
<input type="button" onclick="save_file('ico/people.gif')" value="Save image">
How can I make this work together?
people.gif is just an example. It should, when I get it to work, be replaced by a string, that can represent any image.
Basically, all I want is a save image button.
$file = $_GET['image'];
instead of your first line should do it.
Related
I am trying to get my php script to download an image which the name of is being sent in from an ajax function in my javascript, and I think I'm using all the right headers and then I'm using readfile() to download the image, and when I preview the php when it runs with the chrome developer tools (ctrl+shift+i-> network -> XHR -> preview) all I get is a bunch of gibberish binary and my image doesn't download. Does anyone know why this is happening/how to fix it?
Here's my ajax which is just in a function that runs when a "download" button is clicked
$.ajax({
type: "POST",
url: 'requestAJAX.php',
data: {request: request, download: imageName},
success: function(){
console.log("Request Completed: " + request);
} // success
});
and here's my "requestAJAX.php"
<?php
switch ($_POST["request"]) {
case "download":
// Get parameters
$file = $_POST["download"];
$filepath = "UploadedImages/" . $file;
if(file_exists($filepath)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.$file.'"');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($filepath));
ob_clean();
flush();
// download
readfile($filepath);
exit;
} // if
break;
default:
echo "No request was made";
}
?>
and this is what I'm getting when I preview (not sure how it will help)
ÿØÿàJFIFHHÿâ#ICC_PROFILE0appl mntrRGB XYZ ÙacspAPPLapplöÖÓ-appldscmòdescüogXYZlwtptrXYZbXYZ¨rTRC¼cprtÌ8chad,gTRC¼bTRC¼mlucenUS&~esES&daDK.êdeDE,¨fiFI(ÜfrFU(*itIT(VnlNL(nbNO&ptBR&svSE&jaJPRkoKR#zhTWlzhCNÔruRU"¤plPL,ÆYleinen RGB-profiiliGenerisk RGB-profilProfil Générique RVBN, RGB 0×0í0Õ0¡0¤0ëu( RGB r_icÏðPerfil RGB GenéricoAllgemeines RGB-Profilfn RGB cÏðeNöGenerel RGB-beskrivelseAlgemeen RGB-profielÇ|¼ RGB Õ¸\ÓÇ|Profilo RGB GenericoGeneric RGB Profile1I89 ?#>D8;L RGBUniwersalny profil RGBdescGeneric RGB ProfileGeneric RGB ProfileXYZ Zu¬s4XYZ óRÏXYZ tM=îÐXYZ (¸6curvÍtextCopyright 2007 Apple Inc., all rights reserved.sf32BÞÿÿó&ýÿÿû¢ÿÿý£ÜÀlÿáExifMM*JR(iZHH é ¡ÿÛC
Thanks in advance for any assistance!
I am trying to download a pdf when clicking on a link.
I called function onlick of a link and in Codeigniter i wrote a function to download PDF file but when running URL ,file is downloaded but when triggered using click of link, its not working.
Controller:
function downloadpdf($pid)
{ set_time_limit(0);
$url="http://www.malayatourism.com/uploads/images/packages/pdf/$pid.pdf";
$file = basename($url);
$fp = fopen($file, 'w');
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_FILE, $fp);
$data = curl_exec($ch);
curl_close($ch);
fclose($fp);
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
echo "success";
}
My code ajax:
function DownLoadPdf(id)
{
url = "<?php echo base_url();?>admin/packages/downloadpdf/"+id;
$.ajax({
type:'POST',
url: url,
data : { pid : id},
success : function(response) {
console.log(response);
},
error : function(response) {
console.log("error");
}
});
}
View:
echo ' Download Attachment';
As far as ajax is concerned you cannot do that via ajax because ajax is not made for this purpose,its an asynchronous call that will give you a result. But you can do this without using any jquery, ajax at all
<a href="http://www.malayatourism.com/uploads/images/packages/pdf/$pid.pdf" download> Download Attachment</a>
Where $pid is the id you want to download the file. The download attribute will force the file to download. Cheers
My file download works great. The file is delivered correctly. But I want to make it prettier.
Is there a way to set a favicon and a window title, if I click on a html-download link to a file in a new tab?
the file is generated and streamed by php.
client part:
<a target="_blank" tabindex="0" href="/path/to/file-download/interface" >
server stream, while $file is some array holding file information:
if (file_exists($file['path'])) {
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $file['path']);
if( strstr($mime, "image") !== false ){
header('Content-Type: '.$mime);
header('Content-Disposition: filename='.basename($file['path']));
} else {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file['path']));
}
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file['path']));
ob_clean();
flush();
readfile($file['path']);
exit;
} else {
error_log("File for download >".$file['path']."< not found.");
return false;
}
UPDATE
An additional problem is, that there is a favicon already in the root folder, but I want to show a different one.
On my website I have a JavaScript function that using PHP function creates a file locally on my server (same directory as the website files). The name of this file is known only to these JavaScript and PHP functions.
I want to open a regular 'Save As' box to the user to download this file.
Is there a way to do this using Javascript/PHP in a manner that will work for Firefox, Chrome and Explorer/Edge? (Only the Javascript/PHP know the file name)
This is the PHP example:
file_put_contents($filename,$txt);
header('content-type: application/text');
header('content-disposition: attachment; filename=' . $filename);
readfile($filename);
In chrome & firefox it saves automatically and in IE a window opens so if a user has not changed their settings by default will they see the where to save dialog regardless of the browser they're using. go to
https://support.google.com/chrome/answer/95574?hl=en-GB
For more information. You can use php code for downloading the file from your server.
header('content-type: application/[type]');
header('content-disposition: attachment; filename=yourfile.file-extension');
readfile('yourfile.file-extension');
for a large file, you can use
function readfileChunked($filename, $retbytes=true){
$chunksize = 1*(1024*1024);
$buffer = '';
$cnt = 0;
$handle = fopen($filename, 'rb');
if ($handle === false) {
return false;
}
while (!feof($handle)) {
$buffer = fread($handle, $chunksize);
echo $buffer;
ob_flush();
flush();
if ($retbytes) {
$cnt += strlen($buffer);
}
}
$status = fclose($handle);
if ($retbytes && $status) {
return $cnt; // return num. bytes delivered like readfile() does.
}
return $status;
}
header('Pragma: public'); // required
header('Expires: 0'); // no cache
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: private',false);
header('Content-Type: application/force-download');
header('Content-Disposition: attachment; filename="'.$name.'"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: '. get_remote_size($url) );
header('Connection: close');
readfileChunked( $url );
Try to make a download page with pure php.
For those people that have javascript enabled, I plan to extend the download page with some feedback.
Have done some protyping...
when the user press on the download button (post) the download starts.
There is no page change and the java scripts are still executable on the download page.
Is this something that could rely on, that the javascript still executes after a forced download?
simple example, test.php:
<?php
if (!isset($_POST["submit"])) {
$content = '
<script type="text/javascript">
var count = 0;
function tick(){
count++;
console.log("tick() " + count);
setTimeout("tick()", 1000);
}
tick();
</script>
<form method="post" action="">
Download file</br>
<input type="submit" name="submit" value="Submit" />
</form>
';
echo $content;
} else {
$file = 'contentFile.zip';
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename='.basename($file));
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;
}
}
?>