2009年7月28日 星期二

新竹 - 日式料理 - 壽司店 ☆


這家店位於新竹縣竹北市三民路上,接近博愛路口,沒有店名,走進店裡的看來多是熟客,東西都是物美價廉(俗擱大碗),裡面大概只有四張桌子,不過還好很多人都外帶,今天小弟點了鮭魚炒飯、握壽司、綜合小菜以及味增湯($20,裡面有不少魚肉唷)。 不過老闆娘表示過幾天要搬到三民路250號,派出所的對面。
鮭魚炒飯
握壽司,個人覺得飯有點硬,生魚片感覺很新鮮。
綜合小菜,菜色可以自己搭配。
味增湯,味道有些SOSO,不過有大大的魚肉。

類別:日式料理
店名:無
地點:新竹縣竹北市三民路250號
評論:☆ 便宜大碗型

2009年7月27日 星期一

在cgic中印出form中所有的data


在cgic中印出form中所有的data是我覺得是非常重要的功能之一,因為這可以幫助你debug,印出cgi到底收到哪些from,以及其內容(value)為何。
首先利用cgiFormEntries()抓取form中所有欄位名稱(field name),接著在利用cgiFormStringNoNewlines()抓取內容(value)。
#include <stdio.h>
#include <string.h>
#include "cgic.h"

int cgiMain(int argc, char *argv[])
{
    int ret;
    char **array, **arrayStep, value[64];

    cgiHeaderContentType("text/html");
    if (cgiFormEntries(&array) != cgiFormSuccess) {
        return -1;
    }

    for (arrayStep = array; *arrayStep; arrayStep++) {
        snprintf(value, sizeof(value), "%s=", *arrayStep);
        if ((ret =
             cgiFormStringNoNewlines(*arrayStep, value + strlen(value),
                                     sizeof(value) - strlen(value)))
            != cgiFormSuccess) {
            fprintf(cgiOut, "<p>%s(null). failed</p>\n", value);
        } else {
            fprintf(cgiOut, "<p>%s</p>\n", value);
        }
    }
    return 0;
}


利用cgic上傳檔案


CGIC提供一些上傳檔案的API,讓您可以輕鬆的利用這些API處理上傳檔案。
注意,您的form必須將enctype設定為multipart/form-data。
<html>
    <head><title>upload test</title></head>
    <body>
        <form method="post" enctype="multipart/form-data"
                action="upload.cgi">
            <input type="file" name="fileName" />
            <input type="submit" />
        </form>
    </body>
</html>

接著就是處理CGI的部份了。
1. 首先就是利用cgiFormFileName()檢查檔案是否被提交。
2. 接著利用cgiFormFileOpen()取得cgiFilePtr的object。
3. 再利用while(cgiFormFileRead(cgiFilePtr) == cgiFormSuccess)讀取資料。
4. 利用cgiFormFileClose(cgiFilePtr)釋放不再需要的cgiFilePtr。

#include <stdio.h>
#include <cgic.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>

#define F_FILENAME      "fileName"
#define FILENAME_LEN    1024
#define BUF_LEN         1024

int cgiMain(int argc, char *argv[])
{
    cgiFilePtr cfp;
    char rfile[FILENAME_LEN] /*remote file */ ,
        lfile[FILENAME_LEN] /* local file */ , buf[BUF_LEN];
    int ret, fd, fsize, got;

    cgiHeaderContentType("text/html");
    if ((ret = cgiFormFileName(F_FILENAME, rfile, sizeof(rfile))) !=
        cgiFormSuccess) {
        fprintf(cgiOut, "<p>No file was uploaded.(%d)</p>", ret);
        return -1;
    }
    cgiFormFileSize(F_FILENAME, &fsize);

    if ((ret = cgiFormFileOpen(F_FILENAME, &cfp)) != cgiFormSuccess) {
        fprintf(cgiOut, "<p>open cgi file failed.(%d)</p>", ret);
        return -1;
    }
    snprintf(lfile, sizeof(lfile), "/tmp/%s", rfile);
    fprintf(cgiOut, "write to %s", lfile);
    if ((fd =
         open(lfile, O_CREAT | O_WRONLY,
              S_IRWXU | S_IRWXG | S_IRWXO)) < 0) {
        fprintf(cgiOut, "<p>create file on server failed.(%s)</p>",
                strerror(errno));
        return -1;
    }
    while (cgiFormFileRead(cfp, buf, sizeof(buf), &got) == cgiFormSuccess) {
        if ((ret = write(fd, buf, got)) < 0) {
            fprintf(cgiOut, "<p> write failed(%d/%s)</p>\n", errno,
                    strerror(errno));
        }
        fprintf(cgiOut, "<p>got(%d)</p>\n", got);
    }
    close(fd);
    cgiFormFileClose(cfp);
    fprintf(cgiOut, "<p> end </p>\n");
    return 0;
}

基本上,I/O讀取上利用buffered I/O是比較有效率的,不過範例沒有用buffered I/O,留給大家去修改一下吧。
參考資料: http://www.boutell.com/cgic/


熱門文章