Я хочу, чтобы создать правильный 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
}
;------------------------------------------------------------
Я отредактировал свой вопрос, добавив образец кода. Одна из проблем, которые я вижу, - это то, что в имени пользователя есть амперсанд (@) (мой провайдер хостинга заставляет это). Итак, в URL есть два амперсанда: один в имени пользователя и другой до адреса ftp-сайта. Должен ли первый кодировать или сбежать каким-то образом? – JnLlnd
Спасибо за повторное редактирование вопроса, Мартин. Это делало это до такой степени. – JnLlnd