質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.92%

FTPサーバに画像をポストしたいです。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 625

Gunjirk

score 22

ローカルのC:/screenshot.jpgをFTPサーバのscreenshot/172にポストしたいです。

io.Readerの扱い方を調べましたが、いまいちわからず。。。
宜しくお願いします。

エラー内容
2020/07/21 10:07:05 [FATAL] unexpected EOF

参考サイト
https://github.com/jlaffaye/ftp

package main

import (
    "context"
    "crypto/tls"
    "io"
    "log"
    "net"
    "os"
    "time"

    "github.com/jlaffaye/ftp"
    "github.com/spiegel-im-spiegel/logf"
)

// DialOption dialOptions
type DialOption struct {
    setup func(do *dialOptions)
}

// dialOptions contains all the options set by DialOption.setup
type dialOptions struct {
    context     context.Context
    dialer      net.Dialer
    tlsConfig   *tls.Config
    explicitTLS bool
    conn        net.Conn
    disableEPSV bool
    location    *time.Location
    debugOutput io.Writer
    dialFunc    func(network, address string) (net.Conn, error)
}

// DialWithExplicitTLS returns a DialOption that configures the ServerConn to be upgraded to TLS
// See DialWithTLS for general TLS documentation
func DialWithExplicitTLS(tlsConfig *tls.Config) DialOption {
    return DialOption{func(do *dialOptions) {
        do.explicitTLS = true
        do.tlsConfig = tlsConfig
    }}
}

func main() {

    ent, err := os.Stat("C:/screenshot.jpg")
    if err != nil {
        logf.Fatal(err)
    }

    if ent == nil {
    } else {

        //Upload a file
        var r io.Reader
        if r, err = os.Open("C:/screenshot.jpg"); err != nil {
            logf.Fatal(err)
        }

        c, err := ftp.Dial("ftp.example.org:21", ftp.DialWithExplicitTLS(&tls.Config{
            // Set InsecureSkipVerify to skip the default validation we are
            // replacing. This will not disable VerifyPeerCertificate.
            InsecureSkipVerify: true,

            // While packages like net/http will implicitly set ServerName, the
            // VerifyPeerCertificate callback can't access that value, so it has to be set
            // explicitly here or in VerifyPeerCertificate on the client side. If in
            // an http.Transport DialTLS callback, this can be obtained by passing
            // the addr argument to net.SplitHostPort.
            ServerName: "ftp.example.org",

            // On the server side, set ClientAuth to require client certificates (or
            // VerifyPeerCertificate will run anyway and panic accessing certs[0])
            // but not verify them with the default verifier.
            // ClientAuth: tls.RequireAnyClientCert,
        }))
        if err != nil {
            log.Fatal(err)
        }

        err = c.Login("user", "password")
        if err != nil {
            log.Fatal(err)
        }

        c.ChangeDir("screenshot/172")

        for range time.Tick(1 * time.Second) {

            ch := make(chan string)

            go ftps(c, r, ch)

            cf := <-ch

            if cf != "0" {
                logf.Printf("スクリーンショット転送完了")
            }
        }

        if err := c.Quit(); err != nil {
            log.Fatal(err)
        }
    }
}

func ftps(c *ftp.ServerConn, r io.Reader, ch chan string) {

    if err := c.Stor("screenshot.jpg", r); err != nil {
        logf.Fatal(err)
        ch <- "0"
    }
    ch <- "1"

}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

1秒おきにr io.Readerの内容を繰り返し転送されようとしています。
1度目の転送はおそらく正しく処理できているのだと思いますが、
その時点でrはEOFまで読み込み済みになります。
io.Readerは繰り返し内容を読める機能はありません(一度読んだらそれっきり)
2度目の転送ではいきなりEOFが来ることでエラーになっているのではないでしょうか。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/22 15:58

    ありがとうございます。
    おそらくそのようです。
    間隔の秒数を変えてみたら、うまくいきました!

    キャンセル

  • 2020/07/22 19:09

    可能であれば、うまくいった例も貼っていただけると助かります!

    キャンセル

  • 2020/07/29 16:50

    teratail開いておらず、気づきませんでした!
    すみません!
    自己解決にて、うまくいった例を記載しておいたので、ご参考までに!

    キャンセル

0

for range time.Tick(1 * time.Second) 

for range time.Tick(10 * time.Second)
に変更で動きました!

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る