2014年7月10日 星期四

PHP不透過curl來達到使用POST讀取網頁或CGI

今天在網路上找尋PHP不透過curl來達到使用POST讀取網頁或CGI的方式:
找到以下資訊確實可用:
(原文出處:http://wezfurlong.org/blog/2006/nov/http-post-from-php-without-curl/)
函式宣告:
function do_post_request($url, $data, $optional_headers = null)
{
  $params = array('http' => array(
              'method' => 'POST',
              'content' => $data
            ));
  if ($optional_headers !== null) {
    $params['http']['header'] = $optional_headers;
  }
  $ctx = stream_context_create($params);
  $fp = @fopen($url, 'rb', false, $ctx);
  if (!$fp) {
    throw new Exception("Problem with $url, $php_errormsg");
  }
  $response = @stream_get_contents($fp);
  if ($response === false) {
    throw new Exception("Problem reading data from $url, $php_errormsg");
  }
  return $response;
}
使用方式:
echo do_post_request("http://192.168.172.203/cgi-bin/ed3.cgi","page_charset=big5&userid=admin&userpwd=123456&pagename=26&mainmenu=69&page=0");

2014年6月2日 星期一

form一次選擇多個檔案+php上傳範例

<?
for($i = 0 ; $i < count($_FILES["files"]["name"]) ; $i++) { echo $_FILES["files"]["name"][$i]."</br>"; } ?> <form action='' method='post' enctype='multipart/form-data'> <input name="files[]" type="file" multiple="multiple"/> <input type='submit' value='test'> </form>

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");