Лучший шаблон для создания sha256 из файла и файла хранения - PullRequest
0 голосов
/ 02 ноября 2018

Я пишу веб-сервер, который получает файл для загрузки как multipart/form-data. Я генерирую файл sha256 из запроса, но из-за особенностей интерфейса Reader я не могу повторно использовать данные для загрузки файла в файлер. Этих файлов может быть несколько сотен MB с. Каков наилучший способ хранения контента? Я могу продублировать содержимое, но я беспокоюсь, что это может привести к расточительству ресурсов памяти.

EDIT

func uploadFile(w http.ResponseWriter, r *http.Request) {
    f, err := r.MultipartForm.File["capture"][0].Open()
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    defer f.Close()
    hash, err := createSha(f)
    if err != nil {
        fmt.Println(err.Error())
        return
    }
}

func createSha(image multipart.File) (hash.Hash, error) {
    sha := sha256.New()
    // This cause the contents of image to no longer be available to be read again to be stored on the filer
    if _, err := io.Copy(sha, image); err != nil {
        return nil, err
    }
    return sha, nil
}

1 Ответ

0 голосов
/ 02 ноября 2018

Вы можете использовать io.MultiWriter(...) для одновременной отправки данных в несколько выходных потоков, таких как хэш и некоторая удаленная запись.

Например (примерно):

sha := sha256.New()
filer := filer.New(...) // Some Writer that stores the bytes for you?
err := io.Copy(io.MultiWriter(sha, filer), r)
// TODO: handle error
// Now sha.Sum(nil) has the file digest and "filer" got sent all the bytes.

Обратите внимание, что io.Multiwriter может принимать столько писателей, сколько вы хотите, поэтому вы можете одновременно вычислять дополнительные хэши (например, md5, sha1 и т. Д.) Или даже отправлять файл в несколько мест, например ::

md5, sha1, sha256, sha512 := md5.New(), sha1.New(), sha256.New(), sha512.New()
s3Writer, gcsWriter := filer.NewS3Writer(), filer.NewGCSWriter()
mw := io.MultiWriter(awsWriter, gcsWriter, md5, sha1, sha256, sha512)
err := io.Copy(mw, r)
// TODO: handle error
// Now you've got all the hashes for the file and it's stored in the cloud.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...