2015-09-01 1 views
1

Я хочу, чтобы создать правильный URL для отправки файлов Windows Explorer (или других файловых менеджеров, как TotalCommander), используя формат:Действительный URL для FTP-сайта с именем, содержащим @

ftp://username:[email protected]/folder/ 

В обозревателе, он работает с очень прямым именем пользователя и паролем. Но я получаю ошибки (или Explorer просто показывает Мой документ вместо FTP-сайта), когда пароль содержит определенные специальные символы. Я играл с кодировкой URI для кодирования пароля с некоторым успехом, но не на 100% надежным.

Может кто-нибудь помочь мне найти правильные требования для действительного URL-адреса FTP, включая имя пользователя и пароль? Благодарю.

Вот пример кода с помощью команды AutoHotkey «Run» (на Windows 7 64-разрядная среда):

#NoEnv 
#SingleInstance force 

strFTPUrl := "ftp://www.jeanlalonde.ca" 

strLoginName := "[email protected]" 
strPassword := "********" 

StringReplace, strFTPUrl, strFTPUrl, % "ftp://", % "ftp://" . strLoginName . ":" . UriEncode(strPassword) . "@" 

; Before: ftp://ftp.jeanlalonde.ca 
; After: ftp://[email protected]:********@ftp.jeanlalonde.ca 
MsgBox, %strFTPUrl% 

Run, Explorer "%strFTPUrl%" 

return 


;------------------------------------------------------------ 
UriEncode(str) 
; from GoogleTranslate by Mikhail Kuropyatnikov 
; http://www.autohotkey.net/~sumon/GoogleTranslate.ahk 
;------------------------------------------------------------ 
{ 
    b_Format := A_FormatInteger 
    data := "" 
    SetFormat,Integer,H 
    SizeInBytes := StrPutVar(str,var,"utf-8") 
    Loop, %SizeInBytes% 
    { 
    ch := NumGet(var,A_Index-1,"UChar") 
    If (ch=0) 
     Break 
    if ((ch>0x7f) || (ch<0x30) || (ch=0x3d)) 
     s .= "%" . ((StrLen(c:=SubStr(ch,3))<2) ? "0" . c : c) 
    Else 
     s .= Chr(ch) 
    } 
    SetFormat,Integer,%b_format% 
    return s 
} 
;------------------------------------------------------------ 


;------------------------------------------------------------ 
StrPutVar(string, ByRef var, encoding) 
;------------------------------------------------------------ 
{ 
    ; Ensure capacity. 
    SizeInBytes := VarSetCapacity(var, StrPut(string, encoding) 
     ; StrPut returns char count, but VarSetCapacity needs bytes. 
     * ((encoding="utf-16"||encoding="cp1200") ? 2 : 1)) 
    ; Copy or convert the string. 
    StrPut(string, &var, encoding) 
    Return SizeInBytes 
} 
;------------------------------------------------------------ 
+0

Я отредактировал свой вопрос, добавив образец кода. Одна из проблем, которые я вижу, - это то, что в имени пользователя есть амперсанд (@) (мой провайдер хостинга заставляет это). Итак, в URL есть два амперсанда: один в имени пользователя и другой до адреса ftp-сайта. Должен ли первый кодировать или сбежать каким-то образом? – JnLlnd

+0

Спасибо за повторное редактирование вопроса, Мартин. Это делало это до такой степени. – JnLlnd

ответ

1

Если есть специальные символы (@ быть один) в имени пользователя тоже (не только в пароле), вы должны URL-кодировать имя пользователя, так же, как вы кодируете URL-пароль.

Это означает, что вы должны применить UriEncode к strLoginName, так же, как вы применяете его к strPassword.

И вам необходимо обновить UriEncode, чтобы закодировать @, как и нет.

Код @: 0x40.

if ((ch>0x7f) || (ch<0x30) || (ch=0x3d) || (ch=0x40)) 

(Хотя вы можете сравнить @ буквально тоже: ch="@").

+0

Это именно то, чего не хватало. Спасибо за ответ, Мартин! – JnLlnd