類別 URI::FTP

FTP URI 語法由 RFC1738 第 3.2 節定義。

此類別將重新設計,因為實作不同;其路徑的結構。draft-hoffman-ftp-uri-04 是草稿,但它是關於事實上規格的良好摘要。 tools.ietf.org/html/draft-hoffman-ftp-uri-04

常數

COMPONENT

陣列,包含 URI::FTP 可用的元件。

DEFAULT_PORT

預設埠 URI::FTP 為 21。

TYPECODE

類型代碼為「a」、「i」或「d」。

  • 「a」表示文字檔(FTP 指令為 ASCII)

  • 「i」表示二進位檔(FTP 指令為 IMAGE)

  • 「d」表示應顯示目錄的內容

TYPECODE_PREFIX

類型代碼前綴「;type=」。

屬性

typecode[R]

typecode 存取器。

請參閱 URI::FTP::COMPONENT

公開類別方法

build(args) 按一下以切換來源

說明

根據元件建立新的 URI::FTP 物件,並執行語法檢查。

可接受的元件為 userinfohostportpathtypecode

元件應提供為 陣列,或作為 雜湊,其金鑰形成方式為在元件名稱前面加上冒號。

如果使用 陣列,則必須按順序傳遞元件 [userinfo, host, port, path, typecode]

如果提供的路徑是絕對路徑,則會對其進行跳脫,以便在 URI 中使其成為絕對路徑。

範例

require 'uri'

uri1 = URI::FTP.build(['user:password', 'ftp.example.com', nil,
  '/path/file.zip', 'i'])
uri1.to_s  # => "ftp://user:[email protected]/%2Fpath/file.zip;type=i"

uri2 = URI::FTP.build({:host => 'ftp.example.com',
  :path => 'ruby/src'})
uri2.to_s  # => "ftp://ftp.example.com/ruby/src"
呼叫超類別方法
# File lib/uri/ftp.rb, line 96
def self.build(args)

  # Fix the incoming path to be generic URL syntax
  # FTP path  ->  URL path
  # foo/bar       /foo/bar
  # /foo/bar      /%2Ffoo/bar
  #
  if args.kind_of?(Array)
    args[3] = '/' + args[3].sub(/^\//, '%2F')
  else
    args[:path] = '/' + args[:path].sub(/^\//, '%2F')
  end

  tmp = Util::make_components_hash(self, args)

  if tmp[:typecode]
    if tmp[:typecode].size == 1
      tmp[:typecode] = TYPECODE_PREFIX + tmp[:typecode]
    end
    tmp[:path] << tmp[:typecode]
  end

  return super(tmp)
end
new(scheme, userinfo, host, port, registry, path, opaque, query, fragment, parser = nil, arg_check = false) 按一下以切換來源

說明

從沒有語法檢查的通用 URL 組件建立新的 URI::FTP 物件。

與 build() 不同,此方法不會跳脫 RFC1738 所要求的路徑組件;而是按照 RFC2396 處理。

參數依序為 schemeuserinfohostportregistrypathopaquequeryfragment

呼叫超類別方法
# File lib/uri/ftp.rb, line 133
def initialize(scheme,
               userinfo, host, port, registry,
               path, opaque,
               query,
               fragment,
               parser = nil,
               arg_check = false)
  raise InvalidURIError unless path
  path = path.sub(/^\//,'')
  path.sub!(/^%2F/,'/')
  super(scheme, userinfo, host, port, registry, path, opaque,
        query, fragment, parser, arg_check)
  @typecode = nil
  if tmp = @path.index(TYPECODE_PREFIX)
    typecode = @path[tmp + TYPECODE_PREFIX.size..-1]
    @path = @path[0..tmp - 1]

    if arg_check
      self.typecode = typecode
    else
      self.set_typecode(typecode)
    end
  end
end

公開執行個體方法

path() 按一下以切換來源

傳回 FTP URI 的路徑。

RFC 1738 特別指出 FTP URI 的路徑不包含將 URI 路徑與 URI 主機分開的 /。範例

ftp://ftp.example.com/pub/ruby

上述 URI 表示用戶端應該連線到 ftp.example.com,然後從初始登入目錄 cd 到 pub/ruby。

如果您想要 cd 到絕對目錄,您必須在路徑中包含跳脫的 / (%2F)。範例

ftp://ftp.example.com/%2Fpub/ruby

然後此方法會傳回 “/pub/ruby”。

# File lib/uri/ftp.rb, line 240
def path
  return @path.sub(/^\//,'').sub(/^%2F/,'/')
end
to_s() 按一下以切換來源

傳回 URI::FTPString 表示。

呼叫超類別方法
# File lib/uri/ftp.rb, line 251
def to_s
  save_path = nil
  if @typecode
    save_path = @path
    @path = @path + TYPECODE_PREFIX + @typecode
  end
  str = super
  if @typecode
    @path = save_path
  end

  return str
end
typecode=(typecode) 按一下以切換來源

參數

v

字串

說明

typecode v 的公開設定函式 (含驗證)。

另請參閱 URI::FTP.check_typecode

用法

require 'uri'

uri = URI.parse("ftp://[email protected]/my_file.img")
#=> #<URI::FTP ftp://[email protected]/my_file.img>
uri.typecode = "i"
uri
#=> #<URI::FTP ftp://[email protected]/my_file.img;type=i>
# File lib/uri/ftp.rb, line 208
def typecode=(typecode)
  check_typecode(typecode)
  set_typecode(typecode)
  typecode
end

受保護執行個體方法

set_path(v) 按一下以切換來源

URI::FTP 路徑的私密設定函式。

呼叫超類別方法
# File lib/uri/ftp.rb, line 245
def set_path(v)
  super("/" + v.sub(/^\//, "%2F"))
end
set_typecode(v) 按一下以切換來源

typecode v 的私密設定函式。

另請參閱 URI::FTP.typecode=

# File lib/uri/ftp.rb, line 180
def set_typecode(v)
  @typecode = v
end

私有實例方法

check_typecode(v) 按一下以切換來源

驗證類型代碼 v,傳回 truefalse

# File lib/uri/ftp.rb, line 166
def check_typecode(v)
  if TYPECODE.include?(v)
    return true
  else
    raise InvalidComponentError,
      "bad typecode(expected #{TYPECODE.join(', ')}): #{v}"
  end
end