Net::FTP $B$G(B upload $B$N(B resume $B$,$G$-$J$$(B

近永と申します。

Net::FTP#resume= を使用してファイルのアップロードの
再開を可能にしようとしてみたところ、転送結果のファイルが
è¿½åŠ ã§è»¢é€ã—ãŸéƒ¨åˆ†ã ã‘ã«ãªã£ã¦ã—ã¾ã†ç¾è±¡ã«é­é‡ã—ã¾ã—ãŸã€‚
使用していた ftp サーバは vsftp (@RedHat Enterprise Linux)
というものです。

サンプルスクリプトはこんなかんじです。

=== ftp_upload.rb ===
require “net/ftp”

ftp = Net::FTP.new(, , )
ftp.resume = true

ftp.putbinaryfile(“samplefile”)

転送途中で停止させてから再実行すると、リモートには元のファイルの
後半(続行した部分)だけのファイルができあがります。

アップロードの resume は REST+STOR で実現されていますが、
APPE を使用すれば期待したように再開できました。
パッチを添付します。
ご検討よろしくお願いします。

e$B6a1J$H?=$7$^$9!#e(B

e$B<:Ni$7$^$7$?!"=q$-$+$1$GAw?.$7$F$7$^$$$^$7$?!#e(B

[ruby-dev:39714] e$B$KE:IU$7$?%Q%C%A$Oe(B ruby-1.8.7-p174 e$B$Ne(B
e$B%=!<%9$KBP$9$k$b$N$G$9!#e(B
e$B$7$+$7e(B 1.9 e$B7O$Ne(B net/ftp.rb e$B$be(B REST+STOR
e$B$r;H$C$F$$$k$N$Ge(B
e$BF1$88=>]$,5/$-$k$H;W$$$^$9!#e(B

e$B0J>e!#e(B

Tomoyuki C. e$B$5$s$O=q$-$^$7$?e(B:

e$BA0ED$G$9!#e(B

2009e$BG/e(B11e$B7ne(B18e$BF|e(B12:31 Tomoyuki C.
[email protected]:

Net::FTP#resume= e$B$r;HMQ$7$F%U%!%$%k$N%"%C%W%m!<%I$Ne(B
e$B:F3+$r2DG=$K$7$h$&$H$7$F$_$?$H$3$m!“E>Aw7k2L$N%U%!%$%k$,e(B
e$BDI2C$GE>Aw$7$?ItJ,$@$1$K$J$C$F$7$^$&8=>]$KAx6x$7$^$7$?!#e(B
e$B;HMQ$7$F$$$?e(B ftp e$B%5!<%P$Oe(B vsftp (@RedHat Enterprise Linux)
e$B$H$$$&$b$N$G$9!#e(B
(snip)
e$B%”%C%W%m!<%I$Ne(B resume e$B$Oe(B REST+STOR e$B$G<B8=$5$l$F$$$^$9$,!"e(B
APPE e$B$r;HMQ$9$l$P4|BT$7$?$h$&$K:F3+$G$-$^$7$?!#e(B
e$B%Q%C%A$rE:IU$7$^$9!#e(B

e$B$"$j$,$H$&$4$6$$$^$9!#@h$[$Ie(Bcommite$B$7$^$7$?!#e(B

e$B@.@%$G$9!#e(B

Shugo M. wrote:

e$B$"$j$,$H$&$4$6$$$^$9!#@h$[$Ie(Bcommite$B$7$^$7$?!#e(B

e$B$=$b$=$b$+$i9T$/$H!"e(BRFC e$B$G$Oe(B REST e$B$N8e$Ke(B APPE
e$B$O;H$($J$$$h$&$K8+$($^$9!#e(B

e$B$^$?!"$3$N%Q%C%A$Oe(B REST e$B$O4X78$J$/!“e(BAPPE
e$B$G%/%i%$%”%s%HB&$NB3$-$re(B
e$B%5!<%PB&$NKvHx$KDI2C$9$l$P$$$$$@$m$&;WA[$@$H;W$o$l$k$N$G$9$,!"e(B
RFC e$BE*$JN)>l$+$i8@$($P!"e(BFTP
e$B%5!<%P$,%U%!%$%k%7%9%F%`$K3JG<$9$k:]$Ke(B
e$BJQ49Ey$r9T$C$F$$$k$H!“I,$:$7$b$&$^$/$$$+$J$$%1!<%9$,$”$k$O$:$G$9!#e(B

e$BC<E*$K8@$($P$3$N8=>]$K4X$7$F$Oe(B vsftpd
e$BB&$,0-$$$h$&$J5$$,$7$F$$$^$9!#e(B

e$B6a1J$H?=$7$^$9!#e(B

e$B8!>Z$"$j$,$H$&$4$6$$$^$9!#e(B
e$BJdB-$5$;$FD:$-$^$9!#e(B

e$B$=$b$=$b$+$i9T$/$H!“e(BRFC e$B$G$Oe(B REST e$B$N8e$Ke(B APPE e$B$O;H$($J$$$h$&$K8+$($^$9!#e(B
e$B@hF|$N%Q%C%A$G$O%”%C%W%m!<%I$N:F3+;~$K$Oe(B REST
e$B$rAw?.$7$J$$$h$&$Ke(B
e$B$7$^$7$?e(B(transfercmd e$B$NBhFs0z?t$r;XDj$7$J$$$He(B REST
e$B$,Aw?.$5$l$J$$e(B
e$B$h$&$K$J$C$F$$$^$7$?e(B)e$B!#e(B

e$B$^$?!"$3$N%Q%C%A$Oe(B REST e$B$O4X78$J$/!“e(BAPPE e$B$G%/%i%$%”%s%HB&$NB3$-$re(B
e$B%5!<%PB&$NKvHx$KDI2C$9$l$P$$$$$@$m$&;WA[$@$H;W$o$l$k$N$G$9$,!"e(B
RFC e$BE*$JN)>l$+$i8@$($P!"e(BFTP e$B%5!<%P$,%U%!%$%k%7%9%F%`$K3JG<$9$k:]$Ke(B
e$BJQ49Ey$r9T$C$F$$$k$H!“I,$:$7$b$&$^$/$$$+$J$$%1!<%9$,$”$k$O$:$G$9!#e(B
e$B$?$H$($Pe(B ascii
e$BE>Aw$G2~9T$,JQ49$5$l$F$$$k>l9g$J$I$G$7$g$&$+!)e(B
e$B0l1~!"85!9e(B REST e$B$G:F3+$r;n$_$k$N$Oe(B binary
e$B$N;~$@$1$K$J$C$F$$$^$7$?!#e(B

REST e$B$G$N:F3+$Oe(B RFC959
e$B$G$O%V%m%C%/%b!<%Ie(B/e$B05=L%b!<%I$G$N$MxMQ$G$-$ke(B
e$B$h$&$G$9!#%9%H%j!<%`%b!<%I$N>l9g$K%U%!%$%k%*%U%;%C%H$G:F3+0LCV$r;XDje(B
e$B$9$k$N$Oe(B RFC3659 e$B$GDj5A$5$l$?3HD%$@$H;W$$$^$9!#e(B
e$B<P$aFI$
$G$9$,!“e(BSIZE
e$B$G<hF@$7$?0LCV$+$i:F3+e(B(e$BDI2Ce(B)e$B$9$k$3$H$K$J$C$Fe(B
e$B$$$^$9$N$G!”>e5-$N;XE&$Oe(B REST+STOR e$B$rMxMQ$9$k$+e(B APPE
e$B$rMxMQ$9$k$+$Ke(B
e$B4X$o$i$J$$LdBj$G$O$J$$$G$7$g$&$+!#e(B
e$BA02s$NE>Aw$,e(B ascii
e$BE>Aw$5$l$F$$$?$j!"$=$b$=$b%5!<%P$KB8:_$9$k%U%!%$%ke(B
e$B$,E>Aw$7$h$&$H$7$F$$$k%U%!%$%k$NE>AwESCf$N$b$N$G$O$J$$!"$H$$$&$H$-$K$Oe(B
e$BDI2C$7$F$O$$$1$^$;$s$,!"$=$l$Oe(B Net::FTP
e$B$rMxMQ$9$kB&$GH=CG$9$k$7$+$J$$e(B
e$B$+$H;W$$$^$9!#e(B

e$BC<E*$K8@$($P$3$N8=>]$K4X$7$F$Oe(B vsftpd e$BB&$,0-$$$h$&$J5$$,$7$F$$$^$9!#e(B
vsftpd e$B$KLdBj$,$"$k$N$O3N$+$K$=$&$@$H;W$$$^$9!#e(B
FEAT e$B%3%^%s%I$N1~Ez$NCf$Ke(B “REST STREAM” e$B$r4^$s$G$$$k$N$G!"e(B
e$B%9%H%j!<%`%b!<%I$Ne(B REST+STOR e$B$,F0:n$9$k$3$H$,4|BT$5$l$k$N$Ke(B
e$B$A$c$s$HF0:n$7$F$/$l$F$$$^$;$s$+$i!#e(B

e$B<XB-$G$9$,;29M$K@hF|D4::$7$?e(B FTP
e$B%/%i%$%"%s%H$NF0:n$r$^$H$a$F$$-$^$9!#e(B
FileZilla
FEAT e$B$N7k2L$r?.Mj$7$Fe(BREST+STOR e$B$9$k$+e(B APPE
e$B$9$k$+$rJ,4t!#e(B
e$B=>$C$Fe(B vsftp
e$B$KBP$7$F$OB?J,%"%C%W%m!<%I:F3+;~$K$O8mF0:n$9$k$He(B
e$B;W$$$^$9e(B(e$BF0:n$OL$3NG’e(B)e$B!#e(B
ncftp
e$BA4LLE
$Ke(B REST+STOR e$B$+$ie(B APPE e$B$KJQ99e(B(ChangeLog
e$B$h$je(B)
FFFtp
e$B%=!<%9$OL$3NG’$G$9$,!"!VI=<(!We(B->e$B!V=hM}FbMF$r%S%e!<%o$GI=<(!W$+$ie(B
e$B%3%^%s%I$r$_$k$He(B APPE e$B$rMxMQ$7$F$$$k$h$&$G$7$?!#e(B

e$B0J>e!"$h$m$7$/$*4j$$$7$^$9!#e(B

NARUSE, Yui e$B$5$s$O=q$-$^$7$?e(B:

e$BA0ED$G$9!#e(B

2009e$BG/e(B11e$B7ne(B20e$BF|e(B6:02 NARUSE, Yui [email protected]:

RFC e$BE*$JN)>l$+$i8@$($P!"e(BFTP e$B%5!<%P$,%U%!%$%k%7%9%F%`$K3JG<$9$k:]$Ke(B
e$BJQ49Ey$r9T$C$F$$$k$H!“I,$:$7$b$&$^$/$$$+$J$$%1!<%9$,$”$k$O$:$G$9!#e(B

e$B>e5-$K$D$$$F$O!"6a1J$5$s$,JV?.$5$l$F$$$k$h$&$JM}M3$GLdBj$J$$e(B
e$B$HH=CG$7$^$7$?!#e(B

e$BC<E*$K8@$($P$3$N8=>]$K4X$7$F$Oe(B vsftpd e$BB&$,0-$$$h$&$J5$$,$7$F$$$^$9!#e(B

e$B$=$l$O$=$&$+$b$7$l$^$;$s$,!"e(BNet::FTPe$BB&$Ge(BRFCe$B$K0cH?$;$:$KBP1~$G$-$ke(B
e$B$J$iBP1~$7$?$$$H;W$$$^$9!#e(B

e$B@.@%$G$9!#e(B

2009/11/20 9:44, Tomoyuki C. wrote:

e$BJdB-$5$;$FD:$-$^$9!#e(B
(e$BN,e(B)

e$B$J$k$[$I!“3N$+$K6D$k$H$*$je(B APPE
e$B$rMQ$$$k$h$&$KJQ$($?J}$,$h$$$N$G$7$g$&!#e(B
e$BJdB-$”$j$,$H$&$4$6$$$^$7$?!#e(B