This problem is different of the other question problem. That problem was about IF condition. But this problem, instead of downloading file, it is printing on next page. Please don't confuse this question with others.
I have wrote a script which download output of text box. This script works fine on local server, it download the file successfully but when I put script on live server, the download file does not work. When download output button is clicked, instead of downloading file the output of page is shown on next page.
See live script here: http://www.globalitsoft.net/scripts/test.php
Here is the code of script:
<?php
error_reporting(0);
$mytext = "";
$txt = preg_replace('/\n+/', "\n", trim($_POST['inputtext']));
$text = explode("\n", $txt);
$output = array();
if(isset($_POST["submit"]) || isset($_POST["download"]) ) {
for($i=0;$i<count($text);$i++) {
$output[] .= trim($text[$i]) . ' AAAAA'.PHP_EOL;
}
}
if(isset($_POST["download"]) ) {
ob_clean();
$filename = "file-name-" .date('mdY-His'). '.txt';
$handle = fopen('php://output', "w");
fwrite($handle, implode($output));
fclose($handle);
header('Content-Description: File Transfer');
header("Content-type: application/force-download");
header("Content-Type: application/octet-stream charset=utf-8");
header('Content-Disposition: attachment; filename="'.basename($filename).'"');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Expires: 0');
header('Pragma: public');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . strlen(implode($output)));
readfile($filename);
exit();
}
?>
<form method="POST" action="test.php">
<textarea name="inputtext" rows="10" cols="100" placeholder="Enter Any Text!" required><?php if(!empty($_POST["inputtext"])) { echo $_POST["inputtext"]; } ?></textarea>
<br><br>
<input type="submit" name="submit" value="Do it!">
<br><br>
<p>Output goes here. </p>
<textarea name="oputputtext" rows="10" cols="100" ><?php echo implode($output);?></textarea>
<input type="submit" name="download" value="Download Output">
</form>
This works for me:
$handle = fopen("file.txt", "w");
fwrite($handle, "text1.....");
fclose($handle);
header('Content-Type: application/octet-stream');
//You dont need to enclose the filename value in quotes
header('Content-Disposition: attachment; filename='.basename('file.txt'));
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize('file.txt'));
readfile('file.txt');
exit;
Related
I have two button in the form, one is to submit and second button download the output shown in the textarea.
The submit works fine but download button create empty file and does not write data of output text area.
Here is code:
<?php
error_reporting(0);
$mytext = "";
$txt = preg_replace('/\n+/', "\n", trim($_POST['inputtext']));
$text = explode("\n", $txt);
$output = array();
if(isset($_POST["submit"]))
{
for($i=0;$i<count($text);$i++)
{
$output[] .= trim($text[$i]) . ' Text added with output'.PHP_EOL;
}
}
if(isset($_POST["download"]) ) {
$handle = fopen("file.txt", "w");
fwrite($handle, implode($output));
fclose($handle);
header('Content-type: application/octet-stream');
header('Content-Disposition: attachment;filename='.basename('file.txt'));
header('Expires: 0');
ob_end_clean();
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize('file.txt'));
readfile('file.txt');
exit;
}
?>
<form method="POST" action="test.php">
<textarea name="inputtext" rows="10" cols="100" placeholder="Enter Any Text!" required><?php if(!empty($_POST["inputtext"])) { echo $_POST["inputtext"]; } ?></textarea>
<br><br>
<input type="submit" name="submit" value="Do it!">
<br><br>
<p>Output goes here. </p><textarea name="oputputtext" rows="10" cols="100" ><?php echo implode($output);?></textarea>
<input type="submit" name="download" value="Download Output">
</form>
You have to generate the output also if downloading (unless you take it from the second textarea), so use if(isset($_POST["submit"]) || isset($_POST["download"]) ) in the test, instead of only if(isset($_POST["submit"]))
The final code would look like this:
<?php
error_reporting(0);
$mytext = "";
$txt = preg_replace('/\n+/', "\n", trim($_POST['inputtext']));
$text = explode("\n", $txt);
$output = array();
/* CHANGED HERE */
if(isset($_POST["submit"]) || isset($_POST["download"]) ) {
for($i=0;$i<count($text);$i++) {
$output[] .= trim($text[$i]) . ' Text added with output'.PHP_EOL;
}
}
if(isset($_POST["download"]) ) {
$handle = fopen("file.txt", "w");
fwrite($handle, implode("\r",$output));
fclose($handle);
header('Content-type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename('file.txt'));
header('Expires: 0');
ob_end_clean();
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize('file.txt'));
readfile('file.txt');
exit;
}
?>
<form method="POST" action="test.php">
<textarea name="inputtext" rows="10" cols="100" placeholder="Enter Any Text!" required><?php if(!empty($_POST["inputtext"])) { echo $_POST["inputtext"]; } ?></textarea>
<br><br>
<input type="submit" name="submit" value="Do it!">
<br><br>
<p>Output goes here. </p>
<textarea name="oputputtext" rows="10" cols="100" ><?php echo implode($output);?></textarea>
<input type="submit" name="download" value="Download Output">
</form>
Mysql run more than once while i try to download with download manager.
if(isset($_POST["fname"]) && isset($_SESSION['token']) && $_POST["token"] == $_SESSION['token']){
// after submit it runs two times
$sql = "INSERT INTO testpage SET
username = 'test',
name = 'xyz'
";
if(!mysqli_query($db_conx, $sql)){
echo mysqli_error($db_conx);
exit;
}
$fullPath = 'user/pdf/xyz.pdf';//let the path is this
$basefile_name = "abcd" ;
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . basename($basefile_name.".pdf"));
header('Content-Transfer-Encoding: binary');
header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1.
header("Pragma: no-cache");
header('Expires: 0');
header('Content-Length: ' . filesize($fullPath));
ob_clean();
flush();
readfile($fullPath);
exit;
}
if (function_exists('mcrypt_create_iv')) {
$token = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));
} else {
$token = bin2hex(openssl_random_pseudo_bytes(32));
}
$_SESSION['token'] = $token;
and the html part is
<div class="container">
<form method="post">
First name: <input type="text" name="fname"><br><br>
Last name: <input type="text" name="lname"><br>
<input type="hidden" name="token" value="<?php echo $token; ?>">
<input type="submit" value="Submit">
</form>
</div>
Still have problen even after adding token where i am wrong .
thanx in advance . php mysql.
I want user to click and download a .doc to wherever they want.. The files download but when you open it, Word says: 'Missing File C:\Users\MyName\style.css. I click OK and then it shows me a corrupted word document.
PHP
<?php
function download($pathToFile) {
header('Content-description: File Download');
header('Content-type: application/force-download');
header('Content-transfer-encoding: binary');
header('Content-length: '.filesize($pathToFile));
header('Content-disposition: attachment; filename="'.basename($pathToFile).'"');
readfile($pathToFile);
}
if($_SERVER['REQUEST_METHOD'] == 'POST'){
if(isset($_POST['CVcrono'])){
download('../curriculum-vitae-modelo1-azul.doc');
}
elseif(isset($_POST['CVfun'])){
download('../curriculum-vitae-modelo1b-azul.doc');
}
elseif(isset($_POST['CVcomb'])){
download('../curriculum-vitae-modelo1c-azul.doc');
}
}
?>
HTML
<tr>
<td>
<input class='entButton' type='submit' name='CVcrono' value="Descargar">
</td>
<td>
<input class='entButton' type='submit' name='CVfun' value="Descargar">
</td>
<td>
<input class='entButton' type='submit' name='CVcomb' value="Descargar">
</td>
</tr>
Try insert
ob_clean();
ob_flush();
flush();
before
readfile($pathToFile);
Try changing the header to:
header("Content-type: application/vnd.ms-word");
I have this form where you enter text into a text area and on submit php generates a text file which is supposed to contain the text that was entered in the text area.
But the problem is from the code i wrote, the text file does download but has no text in it.
So i change the text area into an input field with type text, and it returns the data in the text file, but with no line breaks. Here is my code
<html><body>
<form action="download.php" method="post">
<textarea id="output" name="output"></textarea>
<input type="hidden" name="op" type="hidden" id="fakeop" >
<input type="submit">
</body></html>
And the contents of php file are
<?php
$filename = 'random.txt';
$somecontent = $_REQUEST["output"];
!$handle = fopen($filename, 'w+');
fwrite($handle, $somecontent);
fclose($handle);
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Length: ". filesize("$filename").";");
header("Content-Disposition: attachment; filename=$filename");
header("Content-Type: application/octet-stream; ");
header("Content-Transfer-Encoding: binary");
readfile($filename);
?>
if i change to $somecontent = $_REQUEST["op"];
it does return the text file with the contents. but why not when its output.?
Hello Please Test the php page with below code
<?php
$filename = 'random.txt';
$somecontent = $_POST["output"];
!$handle = fopen($filename, 'w+');
fwrite($handle, $somecontent);
fclose($handle);
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Length: ". filesize("$filename").";");
header("Content-Disposition: attachment; filename=$filename");
header("Content-Type: application/octet-stream; ");
header("Content-Transfer-Encoding: binary");
readfile($filename);
?>
I have store a sample document inside my local server named template.doc. Then I store the file directory inside my sqlite table. I manage to call out the path of the file directory but how can I allow the user to download it?
Codes
<form id="List" name="List" method="post" action="">
<select name="List" id="List">
<?php
if ($Choice !="No")
{
$path = $_SERVER['DOCUMENT_ROOT']."/WEB/";
$fullPath = $path.$_GET['$Choice'];
echo "<form id=\"form7\" name=\"form7\" method=\"post\" action=\"\">";
echo "<input type=\"submit\" name=\"Download\" id=\"Download\" value=".$fullPath."/>";
if (file_exists($fullPath))
{
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($fullPath));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($fullPath));
ob_clean();
flush();
readfile($fullPath);
echo "<label>".$fullPath."</label>";
echo "<input type=\"submit\" name=\"Download\" id=\"Download\" value=".$fullPath."/>";
exit;
echo '</form>';
}
}
?>
How to create a button below the list form and download the microsoft word? It now flushes out the Microsoft word text on the website now, not on the button.
Kindly advise if it's possible to do it. Just for local testing. Thanks alot!
You can use readfile and set the appropriate headers to force a download.
Example from readfile domestication page:
<?php
$file = 'monkey.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;
}
?>
Your form should look something like this
<form name="download" action="download.php" method="post">
<input type="hidden" name="fileID" value="some file identifier" />
<input type="submit" name="submit" value="Download File" />
</form>
Then, in download.php
if(isset($_POST["submit"])) {
$file = $_POST['fileID'];
// download file
}