全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2578
推到 Plurk!
推到 Facebook!

idftp 上傳中文檔名檔案錯誤問題

答題得分者是:GrandRURU
mitchellhu
一般會員


發表:22
回覆:51
積分:14
註冊:2007-06-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-08-22 14:47:37 IP:219.87.xxx.xxx 訂閱
今天遇上一個怪問題,用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的處理嗎?
謝謝!



編輯記錄
mitchellhu 重新編輯於 2011-08-22 00:50:53, 註解 無‧
mitchellhu 重新編輯於 2011-08-22 00:53:49, 註解 無‧
sryang
尊榮會員


發表:38
回覆:741
積分:875
註冊:2002-06-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-08-22 15:45:01 IP:114.35.xxx.xxx 訂閱
你的 FTP server 支援中文檔名嗎?
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
mitchellhu
一般會員


發表:22
回覆:51
積分:14
註冊:2007-06-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-08-22 16:16:14 IP:124.11.xxx.xxx 訂閱
有支援,我有用filezilla 測試同樣的中文檔名檔案,是可以正確傳送的。
所以才會問這個問題.
忘了說,我是在xp sp3 的中文版os 下開發的...
記得delphi 從2009版就全面支援unicode了...我覺得這個問題很奇怪
本來單純想測看看 堃堃堃.txt這樣的檔案可以upload嗎?
結果不行,所以再測一般中文字檔,竟然也不行..
想不出一個道理來....
只好煩請大家提供意見了..
謝謝!
===================引 用 sryang 文 章===================
你的 FTP server 支援中文檔名嗎?
GrandRURU
站務副站長


發表:234
回覆:1651
積分:1742
註冊:2005-06-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-08-22 16:29:17 IP:59.120.xxx.xxx 未訂閱
只要扯到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.
版主


發表:571
回覆:3881
積分:3666
註冊:2006-10-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-08-22 17:19:04 IP:118.169.xxx.xxx 未訂閱
沒有細看你的程式碼, 但我直覺的問題, 應該是出在StrSeg這個函式
2010定義是widestring, 中文也是一個byte, 建 議你先檢查 strseg 出來的檔案訊息是不是正常, 以及使用 length() 來驗證取出的檔名長度為多少, 或許是strseq 取檔時包含了byte ascii 127以前的不可視控制碼, 讓你覺得檔名是沒有問題的(肉眼看的時候)
mitchellhu
一般會員


發表:22
回覆:51
積分:14
註冊:2007-06-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-08-23 10:21:10 IP:124.11.xxx.xxx 訂閱
報告P.D版大:
我以 堃.txt 檔,為測試對象。測試strSeg函式,得出的結果:length=5, result出來的也是=堃.txt 。
證明 堃 這個中文字,delphi 已將它視為一個字元來處理。
但FTP時仍然有問題。
謝謝!
===================引 用 P.D. 文 章===================
沒有細看你的程式碼, 但我直覺的問題, 應該是出在StrSeg這個函式
2010定義是widestring, 中文也是一個byte, 建 議你先檢查 strseg 出來的檔案訊息是不是正常, 以及使用 length() 來驗證取出的檔名長度為多少, 或許是strseq 取檔時包含了byte ascii 127以前的不可視控制碼, 讓你覺得檔名是沒有問題的(肉眼看的時候)
mitchellhu
一般會員


發表:22
回覆:51
積分:14
註冊:2007-06-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2011-08-23 17:57:34 IP:124.11.xxx.xxx 訂閱
報告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 支援中文檔名嗎?
系統時間:2017-10-23 19:34:09
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!