idftp 上傳中文檔名檔案錯誤問題 |
答題得分者是:GrandRURU
|
mitchellhu
一般會員 發表:23 回覆:53 積分:15 註冊:2007-06-12 發送簡訊給我 |
今天遇上一個怪問題,用IdFtp upload 中文檔名的檔案,會出現 Error #10060 time out 及cannot STOR的錯誤,但傳輸英文檔案時就沒問題。
我的開發環境是 Delphi 2010 update 3, 4, 5, Indy 的版本是 10.5.5 程式很在單純,在form 上放了1個button, 1個opendialog,1個IdFTP,1個 [code delphi] unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IdAntiFreezeBase, IdAntiFreeze, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, IdFTP, StdCtrls, sButton, sDialogs; type TForm1 = class(TForm) sButton1: TsButton; IdFTP1: TIdFTP; IdAntiFreeze1: TIdAntiFreeze; sOpenDialog1: TsOpenDialog; procedure sButton1Click(Sender: TObject); private function StrSeg(Str, SegSymbol: String; SegIndex: integer): String; function StrSegCount(Str, SegSymbol: String): integer; { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.sButton1Click(Sender: TObject); var upflname : string; upflnameNOpath : String; begin if sOpenDialog1.Execute then begin upflname := sOpenDialog1.FileName; upflnameNOpath:= StrSeg(upflname,'\',StrSegCount(upflname,'\')); Idftp1.Host := '219.87.xxx.xxx'; Idftp1.Username := 'xxxxx'; Idftp1.Password := 'xxxxx'; Idftp1.Passive := TRUE; if not idFTp1.Connected then idFtp1.Connect; if idFtp1.Connected then begin //idftp1.IOHandler.DefStringEncoding:=TEncoding.UTF8; try Idftp1.Put(upflname,upflnameNOpath); Idftp1.Disconnect; showMessage('upload done!') except on E : Exception do begin ShowMessage('Exception class name = ' E.ClassName); ShowMessage('Exception message = ' E.Message); end; end; end; end; end; function TForm1.StrSeg(Str, SegSymbol: String; SegIndex: integer): String; var r,c,s,sTmp : String; i : integer; begin r:=''; if ((Str='') or (SegIndex<1)) then begin result:=r; exit; end; c:=SegSymbol; if (c='') then c:=','; i:=0; s:=Str; sTmp:=''; while Pos(c,s)>0 do begin i:=i 1; sTmp := Copy(s,1,Pos(c,s)-1); if (SegIndex=i) then begin r:=sTmp; break; end; s:=Copy(s , Pos(c,s) Length(c) , Length(s)-(Pos(c,s) Length(c)) 1); end; if SegIndex=(i 1) then begin r:=s; end; result:=r; end; //計算特定字元的個數 function TForm1.StrSegCount(Str, SegSymbol: String): integer; var r,i:integer; c,s,sTmp : String; begin r:=0; if (Str='') then begin result:=r; exit; end; c:=SegSymbol; if (c='') then c:=','; i:=0; s:=Str; sTmp:=''; while Pos(c,s)>0 do begin i:=i 1; sTmp := Copy(s,1,Pos(c,s)-1); s:=Copy(s , Pos(c,s) Length(c) , Length(s)-(Pos(c,s) Length(c)) 1); end; r:=i 1; result:=r; end; end. [/code] 用法很單純 就是按下button後可以選取要上傳的檔案,如果傳送成功 就會show 一個 upload done!的訊息。 如果有問題就顯示錯誤訊息! 請教上傳中文字檔案時要作unicode的處理嗎? 謝謝! 編輯記錄
|
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
|
mitchellhu
一般會員 發表:23 回覆:53 積分:15 註冊:2007-06-12 發送簡訊給我 |
有支援,我有用filezilla 測試同樣的中文檔名檔案,是可以正確傳送的。
所以才會問這個問題. 忘了說,我是在xp sp3 的中文版os 下開發的... 記得delphi 從2009版就全面支援unicode了...我覺得這個問題很奇怪 本來單純想測看看 堃堃堃.txt這樣的檔案可以upload嗎? 結果不行,所以再測一般中文字檔,竟然也不行.. 想不出一個道理來.... 只好煩請大家提供意見了.. 謝謝! ===================引 用 sryang 文 章=================== 你的 FTP server 支援中文檔名嗎? |
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
只要扯到Indy,就要把它和邏輯脫勾了
試一下這個 http://koti.mbnet.fi/akini/delphi/urldecodeutf8/ 還有這個 http://mrxray.on.coocan.jp/Delphi/plSamples/773_Indy_FTPGetPut.htm#02 ===================引 用 mitchellhu 文 章=================== 有支援,我有用filezilla 測試同樣的中文檔名檔案,是可以正確傳送的。 所以才會問這個問題. 忘了說,我是在xp sp3 的中文版os 下開發的... 記得delphi 從2009版就全面支援unicode了...我覺得這個問題很奇怪 本來單純想測看看 堃堃堃.txt這樣的檔案可以upload嗎? 結果不行,所以再測一般中文字檔,竟然也不行.. 想不出一個道理來.... 只好煩請大家提供意見了.. 謝謝! ===================引 用 sryang 文 章=================== 你的 FTP server 支援中文檔名嗎? |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
mitchellhu
一般會員 發表:23 回覆:53 積分:15 註冊:2007-06-12 發送簡訊給我 |
報告P.D版大:
我以 堃.txt 檔,為測試對象。測試strSeg函式,得出的結果:length=5, result出來的也是=堃.txt 。 證明 堃 這個中文字,delphi 已將它視為一個字元來處理。 但FTP時仍然有問題。 謝謝! ===================引 用 P.D. 文 章=================== 沒有細看你的程式碼, 但我直覺的問題, 應該是出在StrSeg這個函式 2010定義是widestring, 中文也是一個byte, 建 議你先檢查 strseg 出來的檔案訊息是不是正常, 以及使用 length() 來驗證取出的檔名長度為多少, 或許是strseq 取檔時包含了byte ascii 127以前的不可視控制碼, 讓你覺得檔名是沒有問題的(肉眼看的時候) |
mitchellhu
一般會員 發表:23 回覆:53 積分:15 註冊:2007-06-12 發送簡訊給我 |
報告GrandRURU大人:
依據您提供的2個webpage。我研究一會。 第一個page是有關unicode to ansistring/widestring。 測試結果只證明我目前傳輸的字元確定是unicode。 第二page是日本的page,它有提供delphi 2010/xe 、indy10.5.7/10.5.8、xp sp3/win7環境下實測的結果和source code。 我用它的source code測試結果可以傳送unicode 中文檔。 但只要compile後再執行就出錯了,所以明顯是indy問題了,因為我的indy版本10.5.5版 再來下載delphi xe版測試,它的Indy版本是10.5.7版,經測試也是正常。更確定是10.5.5版問題。 只要download 目前最新版的10.5.8版,在delphi 2010 上安裝後(如mephise大大講的有夠煩),測試就ok了。 分數送上 感激不盡 ===================引 用 GrandRURU 文 章=================== 只要扯到Indy,就要把它和邏輯脫勾了 試一下這個 http://koti.mbnet.fi/akini/delphi/urldecodeutf8/ 還有這個 http://mrxray.on.coocan.jp/Delphi/plSamples/773_Indy_FTPGetPut.htm#02 ===================引 用 mitchellhu 文 章=================== 有支援,我有用filezilla 測試同樣的中文檔名檔案,是可以正確傳送的。 所以才會問這個問題. 忘了說,我是在xp sp3 的中文版os 下開發的... 記得delphi 從2009版就全面支援unicode了...我覺得這個問題很奇怪 本來單純想測看看 堃堃堃.txt這樣的檔案可以upload嗎? 結果不行,所以再測一般中文字檔,竟然也不行.. 想不出一個道理來.... 只好煩請大家提供意見了.. 謝謝! ===================引 用 sryang 文 章=================== 你的 FTP server 支援中文檔名嗎? |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |