Yahoo 知識+ 將於 2021 年 5 月 4 日 (美國東岸時間) 停止服務,而 Yahoo 知識+ 網站現已轉為僅限瀏覽模式。其他 Yahoo 資產或服務,或你的 Yahoo 帳戶將不會有任何變更。你可以在此服務中心網頁進一步了解 Yahoo 知識+ 停止服務的事宜,以及了解如何下載你的資料。
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>
<form name="upload" enctype="multipart/form-data"
action="/cgi-bin/upload.cgi" method="POST">
選擇檔案:< input name="contents" type="file"/>< br>
<input type="submit" value="Submit"/>
< /form>
< /body>
< /html>
以上為upload.htm
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);
}
空白列不是原本的資料。
分離後雖然看起來跟原始資料一樣,但檔案大小不同,這對執行檔來說是致命傷。
上傳執行檔的話程式不會停止。
我沒學過c++,下載rudecgi-4.0.1-borland-tools.zip和example2.cpp後,我試著用Dev-C++編譯,但還是不行。
我找到純C語言寫的, http://www.boutell.com/cgic/#obtain ,但還在研究怎麼改寫。
貼網址連到網頁應該不至於違規吧?
經過痛苦的改寫,總算是能上傳檔案了。
最後再問一下,哪裡有介紹伺服器如何接收資料的網站?
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 59 年前
抱歉,問題似乎描述不好。
瀏覽器將test.txt編碼後送到伺服器,看起來會像test2.txt。
所以無法打開test.txt的方式處理(因為在用戶端),只能想辦法從編碼的資料中分離出原本的資料。
從簡單的開始,最後的目標是能上傳執行檔。