5

ドキュメントでは、

ディスクに保存されている場合、ファイルの基になる具象タイプは*os.Fileになります。

この場合、すべてが明確です。素晴らしい。しかし、ファイルがメモリに保存されている場合、そうでない場合はどうなりますか?

私の実際の問題は、htmlフォームを介して取得した、メモリに格納されているさまざまなファイルのサイズを取得しようとしているのですが、場所がないため、os.Statを使用してfileInfo.Size()を実行できないことです。ファイルの名前だけです。

fhs := req.MultipartForm.File["files"]
for _, fileHeader := range fhs {
    file, _ := fileHeader.Open()
    log.Println(len(file)) // Gives an error because is of type multipart.File
    fileInfo, err  := os.Stat(fileHeader.Filename) // Gives an error because it´s just the name, not the complete path

    // Here I would do things with the file
}
4

3 に答える 3

6

multipart.Fileがio.Seekerを実装しているという事実を利用して、そのサイズを見つけることができます。

cur, err := file.Seek(0, 1)
size, err := file.Seek(0, 2)
_, err := file.Seek(cur, 0)

最初の行は、ファイルの現在のオフセットを見つけます。2番目はファイルの終わりを探し、ファイルの先頭との関係でどこにあるかを返します。これはファイルのサイズです。3つ目は、サイズを見つける前に私たちがいたオフセットを探します。

シークメソッドの詳細については、こちらをご覧ください。

于 2013-03-09T13:18:09.550 に答える
2

これを呼び出すとparseMultipartForm(0)、メモリに何かを保存するのではなく、ファイル全体がディスクに書き込まれます。その後、f, _ := FormFile("file")次のようにファイルを統計できます。fi, _ := f.(*os.File).Stat()

于 2013-03-08T15:11:19.933 に答える
1

データをどのように処理するかに応じて、ioutil.ReadAllを使用してファイルをバイトスライスに読み込むのが最善の方法です。(とにかく、最終的にはデータをバイトスライスとして使用する必要があるかもしれません。)これを実行すると、lenで長さがわかります。

于 2013-03-08T20:44:54.630 に答える