I'm working on receiving uploads through a form.

The tricky part is validation.

I attempt to read the first 1024 bytes to check the mime of the file and 
then if valid read the rest and hash it and also save it to disk. Reading 
the mime type is successful and I've gotten it to work by chaining 
TeeReader but it seems very hackish. Whats the idiomatic way to do this?

I'm trying something like this: 


// Parse my multi part form 
...
// Get file handle
file, err := fh.Open()

var a bytes.Buffer

io.CopyN(&a, file, 1024)

mime := mimemagic.Match("", a.Bytes())
// Check mime type (this works fine)

I'm trying to seek a stream so this should be no-op
file.Seek(0, 0)

The file stored on disk is 1KB larger than the original so it appears to be 
re-copying the entire file and appending it to bytes.Buffer
io.Copy(&a, file)

checksum := md5.New()
b := io.TeeReader(&a, checksum)

md5hex := hex.EncodeToString(checksum.Sum(nil))
fmt.Println("md5=", md5hex)

//Open file f for writing to disk
...
//Save file
io.Copy(f, b)


Checked the md5 of (1KB of orig + orig), and (orginal - first 1 KB), 
neither match the md5 of the file being hashed.

Why can't I append the rest of the stream to the byte buffer to get the 
complete file in memory and why is the byte buffer being "consumed"? 

I simply need to read the same array of byte multiple times, I don't need 
to "copy" them. I'm coming from a C background so I'm wondering what is 
going on behind the scenes as well.

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to