PDA

View Full Version : ارسال فایل متنی به مرورگر



p30rex
چهارشنبه 18 خرداد 1390, 18:45 عصر
سلام
اطلاعات یک صفحه ی پی اچ پی رو میخوام به صورت یک فایل قابل دانلود با فرمت txt به مرورگر کاربر ارسال کنم

میشه طریقه ی کار رو بهم بگید؟!
باتشکر

$ M 3 H R D A D $
چهارشنبه 18 خرداد 1390, 19:55 عصر
یعنی پیکار دقیقا ! محتویاتشو لوود کن پرینت کن یا یک تابع هست
show_source
highlight_string

sمیشه محتوا نشون داد واسه شفاف سازی کد ها !

p30rex
چهارشنبه 18 خرداد 1390, 20:04 عصر
یعنی پیکار دقیقا ! محتویاتشو لوود کن پرینت کن یا یک تابع هست
show_source
highlight_string

sمیشه محتوا نشون داد واسه شفاف سازی کد ها !

فکر کنم منظورم رو نتونستم درست عرض کنم!
شما حتما دیدید تو بعضی سایتها مثلا سایت بانک ها :
وقتی صورت حساب رو میگیرید چند گزینه داره -ذخیره با فرمت pdf-excel-word و ... وقتی رویکی از گزینه ها کلیک میکنید صفحه ی دانلود مرورگر باز میشه در حالی که اصلا این اطلاعات روی هاست نیست و توی دیتابیسه
(یعنی آدرسی برای دانلود نیست)

حالا من میخام همین کاررو برای فایلی با فرمتtxt کنم

eshpilen
چهارشنبه 18 خرداد 1390, 21:24 عصر
نظایر این سوال قبلا چند بار مطرح شده. یه سرچ میکردید باید پیدا میشد. دیگه این چیزا که ساده و متداول هست!؟

یه نگاه به این بکنید:

<?php

header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0");
header('Pragma: private');
header("Pragma: no-cache");

header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=source_code.txt");
echo file_get_contents('target.php');

?>
محتویات فایلی بنام target.php رو تحت عنوان source_code.txt برای دانلود به مرورگر کاربر ارسال میکنه.

p30rex
پنج شنبه 19 خرداد 1390, 11:10 صبح
متشکرم
بلد بودم اینو!!!:لبخند:

این کل صفحه رو به مرورگر ارسال میکنه یعنی کدهای php رو هم ارسال میکنه
یعنی همون دانلود معمولی
درصورتی که اطلاعات صفحه ی من برای هرکاربر متغیره و کدهای php هم نمیخوام ارسال بشه فقط خروجی

eshpilen
پنج شنبه 19 خرداد 1390, 11:14 صبح
خب شما خروجیت رو از هرجایی میگیری (مثلا دیتابیس) یا on the fly تولید میکنی فقط همون خروجی رو اکو کن. فرقی نمیکنه!

r0ot$harp
پنج شنبه 19 خرداد 1390, 11:19 صبح
دوست عزیز فکر می کنم این
header("Content-type: application/octet-stream"); رو حذف کنید درست می شه .

اگر این قسمت رو حذف کنید محتوا رو به صورت متنی روی صفحه نشون می ده .شما مگه نگفتین برای دانلود >>>؟؟؟ خودتون می دونین می خواین چی کار کنین ؟؟؟

باتشکر احسان

p30rex
پنج شنبه 19 خرداد 1390, 11:57 صبح
دوست عزیز فکر می کنم این
header("Content-type: application/octet-stream"); رو حذف کنید درست می شه .

اگر این قسمت رو حذف کنید محتوا رو به صورت متنی روی صفحه نشون می ده .شما مگه نگفتین برای دانلود >>>؟؟؟ خودتون می دونین می خواین چی کار کنین ؟؟؟

باتشکر احسان

منظورم از نمایش دادن ، نمایش دادن تو فایل متنی هست نه رو صفحه

تو فایل متنی دستورات php نمایش داده میشه

eshpilen
پنج شنبه 19 خرداد 1390, 13:38 عصر
شاید هم منظور شما این بوده که یه فایل PHP مثل حالت عادی اجرا بشه و خروجی تولید کنه ولی خروجی تولید شده بجای نمایش در مرورگر، در یک فایل متنی دانلود بشه.
منظور شما این که نبوده؟

p30rex
پنج شنبه 19 خرداد 1390, 15:33 عصر
دقیقا....
-------------------------------------------

p30rex
پنج شنبه 19 خرداد 1390, 19:45 عصر
شاید هم منظور شما این بوده که یه فایل PHP مثل حالت عادی اجرا بشه و خروجی تولید کنه ولی خروجی تولید شده بجای نمایش در مرورگر، در یک فایل متنی دانلود بشه.
منظور شما این که نبوده؟

آقا چی شد پس

eshpilen
پنج شنبه 19 خرداد 1390, 19:49 عصر
اینو تست کن:

<?php

$host='localhost';
$file='/target.php';

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if($socket<0) exit("socket_create() failed: reason: " . socket_strerror($socket) . "\n");

$result = socket_connect($socket, $host, 80);
if($result<0) exit("socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n");

$req = "GET $file HTTP/1.1\r\n";
$req .= "Host: $host\r\n";
$req .= "Connection: Close\r\n\r\n";

socket_write($socket, $req, strlen($req));

$resp='';
while($recv=socket_read($socket, 128)) $resp.=$recv;
socket_close($socket);

$body_pos=strpos($resp, "\r\n\r\n");
if($body_pos==-1) {
$body_pos=strpos($resp, "\n\n");
$body_pos+=2;
}
else $body_pos+=4;

header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0");
header('Pragma: private');
header("Pragma: no-cache");

header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=contents.txt");
echo substr($resp, $body_pos);

?>
روی لوکال تست کردم درست کار میکنه.
البته متوجه هستی که این کد فقط برای نشون دادن کلیت روش هست و سردستی درست شده و احتمالا باید چیزهای متعددی بهش اضافه بشه تا کامل و Robust بشه. مثلا هدرهای متعددی که مرورگر ارسال میکنه رو در این برنامه به فایل هدف ارسال نکردیم.
در متغییر $file مسیر و نام فایلی رو که میخوای اجرا و محتویاتش بصورت text دانلود بشه رو بده. در اینجا بنده از فایلی بنام target.php که در ریشهء وب بوده استفاده کردم (اون اسلش اول همهء آدرسها ضروری هست).

ضمنا بنده نمیدونم حالا این به چه درد شما میخوره. این فقط یک فایل میده که محتوی تمام خروجی متن و HTML ای هست که اون صفحهء PHP تولید کرده. بدون فایلهای جانبی ای که یک صفحهء وب معمولی باید داشته باشه (تصاویر، فایلهای CSS و JS و غیره).

p30rex
جمعه 20 خرداد 1390, 12:51 عصر
ممنون از راهنمایی هاتون

من هدفم از این کار اینه:
ابتدا کاربر یه سری تنظیمات انجام میده
بعدش یه کد واسش درست میشه،چند گزینه هست که یکی از اونا ذخیره کده
حالا من میخوام باکلید رو اون ،کد به صورت یه فایل متنی به کاربر ارسال شه

کد بالا رو هم امتحان میکنم

p30rex
جمعه 20 خرداد 1390, 13:00 عصر
اینو تست کن:

<?php

$host='localhost';
$file='/target.php';

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if($socket<0) exit("socket_create() failed: reason: " . socket_strerror($socket) . "\n");

$result = socket_connect($socket, $host, 80);
if($result<0) exit("socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n");

$req = "GET $file HTTP/1.1\r\n";
$req .= "Host: $host\r\n";
$req .= "Connection: Close\r\n\r\n";

socket_write($socket, $req, strlen($req));

$resp='';
while($recv=socket_read($socket, 128)) $resp.=$recv;
socket_close($socket);

$body_pos=strpos($resp, "\r\n\r\n");
if($body_pos==-1) {
$body_pos=strpos($resp, "\n\n");
$body_pos+=2;
}
else $body_pos+=4;

header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0");
header('Pragma: private');
header("Pragma: no-cache");

header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=contents.txt");
echo substr($resp, $body_pos);

?>
روی لوکال تست کردم درست کار میکنه.
البته متوجه هستی که این کد فقط برای نشون دادن کلیت روش هست و سردستی درست شده و احتمالا باید چیزهای متعددی بهش اضافه بشه تا کامل و Robust بشه. مثلا هدرهای متعددی که مرورگر ارسال میکنه رو در این برنامه به فایل هدف ارسال نکردیم.
در متغییر $file مسیر و نام فایلی رو که میخوای اجرا و محتویاتش بصورت text دانلود بشه رو بده. در اینجا بنده از فایلی بنام target.php که در ریشهء وب بوده استفاده کردم (اون اسلش اول همهء آدرسها ضروری هست).

ضمنا بنده نمیدونم حالا این به چه درد شما میخوره. این فقط یک فایل میده که محتوی تمام خروجی متن و HTML ای هست که اون صفحهء PHP تولید کرده. بدون فایلهای جانبی ای که یک صفحهء وب معمولی باید داشته باشه (تصاویر، فایلهای CSS و JS و غیره).

این ارور رو میده:
Fatal error: Call to undefined function socket_create() in d:\Inetpub\wwwroot\test\panel2\save_code.php on line 6

eshpilen
جمعه 20 خرداد 1390, 13:52 عصر
ماجول سوکت PHP شما لود نشده.
بطور مثال اگر روی لوکال تست کردید و از EasyPHP استفاده میکنید، روی آیکون EasyPHP در تسکبار کلیک راست کنید و گزینهء Configuration و بعد درPHP Extension ماجول php_sockets رو فعال کنید و بعد EasyPHP رو راه اندازی مجدد بکنید.
اگر از نرم افزار دیگر استفاده میکنید هم با روش اون نرم افزار. البته فکر میکنم در فایل php.ini اگر خط ;extension=php_sockets.dll رو پیدا کنید و سمیکالن رو از اولش حذف کنید کافی باشه (ریستارت آپاچی یادتون نره).

p30rex
شنبه 21 خرداد 1390, 13:15 عصر
آقا شرمندم به خدا
اجرا میشه اما این کد میاد تو فایل متنی:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html dir=ltr>

<head>
<style>
a:link {font:8pt/11pt verdana; color:FF0000}
a:visited {font:8pt/11pt verdana; color:#4e4e4e}
</style>

<META NAME="ROBOTS" CONTENT="NOINDEX">

<title>The page cannot be found</title>

<META HTTP-EQUIV="Content-Type" Content="text-html; charset=Windows-1252">
</head>

<script>
function Homepage(){
<!--
// in real bits, urls get returned to our script like this:
// res://shdocvw.dll/http_404.htm#http://www.DocURL.com/bar.htm

//For testing use DocURL = "res://shdocvw.dll/http_404.htm#https://www.microsoft.com/bar.htm"
DocURL = document.URL;

//this is where the http or https will be, as found by searching for :// but skipping the res://
protocolIndex=DocURL.indexOf("://",4);

//this finds the ending slash for the domain server
serverIndex=DocURL.indexOf("/",protocolIndex + 3);

//for the href, we need a valid URL to the domain. We search for the # symbol to find the begining
//of the true URL, and add 1 to skip it - this is the BeginURL value. We use serverIndex as the end marker.
//urlresult=DocURL.substring(protocolIndex - 4,serverIndex);
BeginURL=DocURL.indexOf("#",1) + 1;

urlresult=DocURL.substring(BeginURL,serverIndex);

//for display, we need to skip after http://, and go to the next slash
displayresult=DocURL.substring(protocolIndex + 3 ,serverIndex);

InsertElementAnchor(urlresult, displayresult);
}

function HtmlEncode(text)
{
return text.replace(/&/g, '&amp').replace(/'/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
}

function TagAttrib(name, value)
{
return ' '+name+'="'+HtmlEncode(value)+'"';
}

function PrintTag(tagName, needCloseTag, attrib, inner){
document.write( '<' + tagName + attrib + '>' + HtmlEncode(inner) );
if (needCloseTag) document.write( '</' + tagName +'>' );
}

function URI(href)
{
IEVer = window.navigator.appVersion;
IEVer = IEVer.substr( IEVer.indexOf('MSIE') + 5, 3 );

return (IEVer.charAt(1)=='.' && IEVer >= '5.5') ?
encodeURI(href) :
escape(href).replace(/%3A/g, ':').replace(/%3B/g, ';');
}

function InsertElementAnchor(href, text)
{
PrintTag('A', true, TagAttrib('HREF', URI(href)), text);
}

//-->
</script>

<body bgcolor="FFFFFF">

<table width="410" cellpadding="3" cellspacing="5">

<tr>
<td align="left" valign="middle" width="360">
<h1 style="COLOR:000000; FONT: 13pt/15pt verdana"><!--Problem-->The page cannot be found</h1>
</td>
</tr>

<tr>
<td width="400" colspan="2">
<font style="COLOR:000000; FONT: 8pt/11pt verdana">The page you are looking for might have been removed, had its name changed, or is temporarily unavailable.</font></td>
</tr>

<tr>
<td width="400" colspan="2">
<font style="COLOR:000000; FONT: 8pt/11pt verdana">

<hr color="#C0C0C0" noshade>

<p>Please try the following:</p>

<ul>
<li>If you typed the page address in the Address bar, make sure that it is spelled correctly.<br>
</li>

<li>Open the

<script>
<!--
if (!((window.navigator.userAgent.indexOf("MSIE") > 0) && (window.navigator.appVersion.charAt(0) == "2")))
{
Homepage();
}
//-->
</script>

home page, and then look for links to the information you want.</li>

<li>Click the <a href="javascript:history.back(1)">Back</a> button to try another link.</li>
</ul>

<h2 style="font:8pt/11pt verdana; color:000000">HTTP 404 - File not found<br>
Internet Information Services<BR></h2>

<hr color="#C0C0C0" noshade>

<p>Technical Information (for support personnel)</p>

<ul>
<li>More information:<br>
<a href="http://www.microsoft.com/ContentRedirect.asp?prd=iis&sbp=&pver=5.0&pid=&ID=404&cat=web&os=&over=&hrd=&Opt1=&Opt2=&Opt3=" target="_blank">Microsoft Support</a>
</li>
</ul>

</font></td>
</tr>

</table>
</body>
</html>
نمیدونم واسه چی صفحه رو شناسایی نمیکنه!
\ هم اول آدرس میذارم

p30rex
دوشنبه 23 خرداد 1390, 15:17 عصر
چی شد پس؟!!!:افسرده:

eshpilen
دوشنبه 23 خرداد 1390, 17:44 عصر
بنده تاحدی که کمک بصورت ریموت ممکن بود راهنمایی کردم. دیگه بقیش پای خودته. چون داستان یخورده بقول خارجکیا Tricky شده از این ببعد. من نمیدونم روی سیستم یا هاست شما چه شرایطی برقراره. هاست ویندوزی هم نداشتم تاحالا.
حالا سعی کن اطلاعات کاملتر و دقیقتر بدی درمورد محیط آزمایش و پارامترهای مختلف شاید ممکن بود چیزی رو حدس بزنیم.