2014年3月21日 星期五

PHP下載檔案的正確寫法

<?
$file = $_GET["file"];
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=".basename($file));
header("Content-Transfer-Encoding: binary");
$fd = fopen($file, "rb");  //大檔案下載的解決方法~readfile($file)會出問題~
if($fd)
{
    ob_end_clean();
    fpassthru($fd);
}
fclose($fd);
?>

將以上程式儲存成download.php
然後要下載的聯結就以如下方式呼叫:
download.php?file=XXXX
XXXX必須為檔案的完整徑名~~

2013年12月5日 星期四

Node.js建立web service時如何動態指定port

如果我們的web service有可能要占用不同的port而又不希望每次都要改動程式,
我們可以透過外部環境變數來動態改變要占用的port!
如果要可以動態指定,不指定時又有一個預設的port呢?
下面就是這樣的範例(重點在最後一行):

var http = require('http');
http.createServer(function(req,res)
{
res.writeHead(200,{'Content-Type':'text/html'});
res.write('<h1>Node.js</h1>');
res.end('<p>Hello world</p>');
}).listen(process.env.PORT || 80);

所以當你希望他佔住8080 port時:
PORT=8080 node myweb.js
當你希望它使用預設的80 port時(不是管理員身份請記得sudo):
node myweb.js

Node.js建立web service時如何聽80 port?

以下是一個小小的Node.js web service範例:

var http = require('http');
http.createServer(function(req,res)
{
res.writeHead(200,{'Content-Type':'text/html'});
res.write('<h1>Node.js</h1>');
res.end('<p>Hello world</p>');
}).listen(80);

如果我們將他存檔成myweb.js然後執行時,會發生錯誤,但是如果我們將最後一行的
listen(80) 改成 listen(8080) 那就可以正確執行無誤了!

當然以我們的水準絕對不用考慮到是不是犯了80已經被其他web service佔住的錯!

其實只要實驗過就知道,並不是只有80 port 不行,聰明的你看到這邊是不是已經猜到只要是小於1024的port都不行呢?Exactly!只要是小於1024的系統保留port都會出問題~所以這根本就不是Node.js的問題,是我們應該要以系統管理員的身份來執行它:

sudo node myweb.js


2013年12月4日 星期三

innerHtml問題面面觀

innerHtml 是一個非常好用的DOM屬性
但是有一些情況它產生出來的問題超級可怕!!因為根本沒辦法Debug!
現在就兩個狀況敘述一下:
1.Ajax回來的資料顯示不出來:檢查是否有DIV包在外面,或是看看DIV跟Table,TR,TD之間的關係,調整一下應該就可以了。
2.Form裡面的資料innerHtml改過後變數無法submit過去目標網頁,這個超離奇的,沒改過時就可以,一改過就不行了!而且只有被改的欄位有影響,沒被改的欄位仍然正常!目前發現的是在一個table中包了超過一個form就不行!後來改成form包在table外面就解決了,不確定是不能table包在form外面還是不能一個table中包了超過一個form。反正form包在table外面確定是可以的了!

2013年7月25日 星期四

Ajax中文亂碼的解決

因為Ajax的傳輸域設使用了UTF-8編碼,所以如果被呼叫的網頁不是使用UTF-8就會發生中文錯亂的問題,解決的方法就是在被呼叫的網頁中設定送給header的編碼資訊,方法如下:

PHP: header("Content-Type:text/html;charset=BIG5");
ASP: Response.Charset("BIG5")
JSP: response.setHeader("Charset","BIG5");

2013年6月5日 星期三

2013年5月30日 星期四

淺談windows的以系統管理員身分執行

一般來說,在要執行的程式上按右鍵選擇以系統管理員身分執行!
這就像是Linux裡面的sudo ~
如果我不想每次執行都要按右鍵在選擇呢?還是比較喜歡直接點兩下執行呢?
那可以按右鍵選內容,在相容性設定下方會有一個以系統管理員身分執行的核選方塊,打勾即可,講來每次點兩下執行都會以系統管理員身分執行!
如果你興高采烈的開始對一個批次檔(bat)要進行如上所述的設定,你就會失望的發現以系統管理員身分執行的核選方塊居然變成灰色不能選了!這時候怎麼辦呢@@
一、替這個批次檔建立一個捷徑,在捷徑上按右鍵會發現下方有一個進階,點進去就可以看見一道曙光,就是我們需要的以系統管理員身分執行的核選方塊啦!
二、再建一個批次檔,裡面寫入下面指令:
runas /user:Administrator /savecred "[要執行的批次檔的完整徑名]"
值得注意的是:
1.第一次執行必須手動輸入Administrator的密碼,/savecred就是將來使用上次紀錄的認證資訊來執行的意思!不加就必須每次輸入密碼~
2.Administrator不可停用,因為這是以Administrator執行,不僅僅是以系統管理員身分執行!
3.完整徑名會寫紅色的就是強調,不要以為在相同路徑下就可以不完整ㄚ!