2013-03-08 59 views
5

Trong the docs người ta nói rằngGo - Điều gì thực sự là một multipart.File?

Nếu lưu trữ trên đĩa, loại bê tông cơ bản của file sẽ là một * os.File.

Trong trường hợp này mọi thứ đều rõ ràng. Tuyệt quá. Nhưng, điều gì sẽ xảy ra nếu không, nếu tập tin được lưu trong bộ nhớ?

Vấn đề thực tế của tôi là tôi đang cố gắng để có được kích thước của các tập tin khác nhau được lưu trữ trong bộ nhớ mà tôi nhận được mặc dù một hình thức html nhưng tôi không thể sử dụng os.Stat để làm fileInfo.Size() vì tôi don´ t có vị trí của tập tin, chỉ là tên của nó.

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 
} 

Trả lời

6

Bạn có thể khai thác thực tế là multipart.File triển khai io.Seeker để tìm kích thước của nó.

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

Dòng đầu tiên tìm thấy bù đắp hiện tại của tệp. Thứ hai tìm đến cuối tập tin và trả về nơi nó liên quan đến phần đầu của tập tin. Đây là kích thước của tệp. Thứ ba tìm cách bù đắp chúng tôi đã ở trước khi cố gắng tìm kích thước.

Bạn có thể đọc thêm về phương pháp tìm kiếm here.

+0

Cảm ơn, tôi đã suy nghĩ trong một giải pháp có thể như thế này nhưng không bao giờ sử dụng phương pháp Seek và không biết rằng nó rất dễ sử dụng :) – AlvaroSantisteban

2

nếu bạn gọi parseMultipartForm(0) này sẽ viết toàn bộ tập tin vào đĩa thay vì lưu trữ bất cứ điều gì trong bộ nhớ, tiếp theo là f, _ := FormFile("file") sau đó bạn có thể lấy các thông tin tập tin với fi, _ := f.(*os.File).Stat()

1

Tùy thuộc vào những gì bạn muốn làm với dữ liệu, điều tốt nhất để làm có thể là đọc tệp thành một lát byte bằng ioutil.ReadAll. (Bạn có thể muốn các dữ liệu như một lát byte cuối cùng, anyway.) Một khi bạn đã làm điều đó, bạn tìm thấy chiều dài với len.

Các vấn đề liên quan