Yahoo奇摩知識+將於 2021 年 5 月 4 日 (美國東部時間) 終止服務。自 2021 年 4 月 20 日 (美國東部時間) 起,Yahoo奇摩知識+服務將會轉為唯讀模式。其他Yahoo奇摩產品與服務或您的Yahoo奇摩帳號都不會受影響。如需關於Yahoo奇摩知識+ 停止服務以及下載您個人資料的資訊,請參閱說明網頁。

?
Lv 5
? 發問時間: 電腦與網際網路程式設計 · 9 年前

c語言寫cgi上傳檔案之分離字串

我寫了一個cgi程式處理上傳檔案的工作,其中

test.txt內容

This is a test1.

This is a test2.

This is a test3.

upload.c內容(編譯後將檔名改成upload.cgi就是cgi程式)

#include<stdio.h>

#include<stdlib.h>

int main()

{

int c;

FILE *p;

puts("content-type:text/plain");

puts("");

p=fopen("test.txt2","wb");

while((c=getchar())!=EOF)

fprintf(p,"%c",c);

fclose(p);

return 0;

}

test2.txt內容

-----------------------------24393354819629

Content-Disposition: form-data; name="contents"; filename="test.txt"

Content-Type: text/plain

This is a test1.

This is a test2.

This is a test3.

-----------------------------24393354819629--

現在卡在如何從test2.txt分離出test.txt的資料,請問有什麼好方法嗎?

另外,用記事本開test2.txt的話會有黑色方格出現,也沒換行。

補充:

XAMPP是一個把Apache 網頁服務器與PHP、Perl及MySQL集合在一起的安裝包,允許用戶可以在自己的電腦上輕易的建立網頁服務器。

http://127.0.0.xn--1http-xm6j//localhost%E5%8F%AF%...

不想下載的話可以用重導向測試,將upload.cgi和test2.txt放在c槽,進入命令提示字元中:

cd c:\

c:\upload.cgi<test2.txt

已更新項目:

upload.htm內容(放在c:\xampp\htdocs中)

< html>

< head>

< title>Upload Page< /title>

< /head>

< body>

2 個已更新項目:

<form name="upload" enctype="multipart/form-data"

action="/cgi-bin/upload.cgi" method="POST">

選擇檔案:< input name="contents" type="file"/>< br>

3 個已更新項目:

<input type="submit" value="Submit"/>

< /form>

< /body>

< /html>

以上為upload.htm

4 個已更新項目:

gets(temp);

while(strcmp(temp,""))

gets(temp);

p=fopen("test2.txt","wb");

gets(temp);

while(strncmp(temp,"-----------------------------",29))

{

fputs(temp,p);

fputs("\r\n",p);

gets(temp);

}

5 個已更新項目:

空白列不是原本的資料。

分離後雖然看起來跟原始資料一樣,但檔案大小不同,這對執行檔來說是致命傷。

上傳執行檔的話程式不會停止。

6 個已更新項目:

我沒學過c++,下載rudecgi-4.0.1-borland-tools.zip和example2.cpp後,我試著用Dev-C++編譯,但還是不行。

我找到純C語言寫的, http://www.boutell.com/cgic/#obtain ,但還在研究怎麼改寫。

貼網址連到網頁應該不至於違規吧?

7 個已更新項目:

經過痛苦的改寫,總算是能上傳檔案了。

最後再問一下,哪裡有介紹伺服器如何接收資料的網站?

3 個解答

評分
  • 匿名使用者
    9 年前
    最佳解答

    你希望的比較方式及結果的呈現方式為何?

    是要一行一行比較,還是三行一起比較?

    This is a test1.

    This is a test2.

    This is a test3.

    比較字串一般的想法是,把TXT1和TXT2都讀進buffer裡,再套用你的比較用的演算法,至於要怎麼比,跟你的需求有關。

    用記事本開test2.txt的話會有黑色方格出現,這一般表示編碼方式不對,可能是txt是ASCII格式,但裡面有UNICODE字元。

    2012-07-03 09:09:23 補充:

    如果是這個需求的話…,

    我建議在你的test.txt加上開始及結束的tag

    讓test2變成:

    -----------------------------24393354819629

    Content-Disposition: form-data; name="contents"; filename="test.txt"

    Content-Type: text/plain

    [Start]

    This is a test1.

    This is a test2.

    This is a test3.

    [End]

    -----------------------------24393354819629--

    類似像這樣,然後把[Start][End]中間的文字寫入新檔案

    如果不行的話,用Content-Type: text/plain和-----------------------------當開始及結尾應該也行…

    至於黑色方格,我還是覺得跟編碼方式有關,檢查一下你抓文字上傳的地方吧,看是不是可以設定Encoding

    2012-07-04 09:32:10 補充:

    下載個二進位的比較工具,像是ultracompare

    http://www.softking.com.tw/soft/clickcount.asp?fid...

    比較看看你做出來的檔和原始檔有什麼不同,一般應該是開頭或結尾處多了什麼東西。比較後就可以知道判斷開始和結束的條件該怎麼修改。

    另外,這裡有一份教學,可以參考看看,看起來有現成的函式可以做到這件事,說不定不用自己處理。

    http://www.rudeserver.com/cgiparser/tut_fileupload...

    看到滿多人貼網址都要改一下,怕違規,我也試試,WWW改www吧,不知道有沒有用

    2012-07-05 09:00:42 補充:

    有方向可以研究就好,有時就只是不知道要找什麼關鍵字而已

    違規是因為知識家���了防廣告,會自動block特定的連結,如果你貼的網址在他的列表裡,那就直接違規了,不用人檢舉。

  • ?
    Lv 5
    9 年前

    抱歉,問題似乎描述不好。

    瀏覽器將test.txt編碼後送到伺服器,看起來會像test2.txt。

    所以無法打開test.txt的方式處理(因為在用戶端),只能想辦法從編碼的資料中分離出原本的資料。

    從簡單的開始,最後的目標是能上傳執行檔。

  • eric
    Lv 4
    9 年前

    您的問題描述具有相當的教育性, 謝啦!

還有問題?馬上發問,尋求解答。