Golang архив / zip, создающий поврежденные файлы с помощью Pipes - PullRequest
1 голос
/ 23 апреля 2020

Я пытаюсь вытащить файлы из экземпляра хранилища файлов MinIO, заархивировать файлы и скопировать zip-файлы обратно в minio. Я получил большую часть его работы, но по какой-то причине ZIP-файл, который попадает в хранилище, поврежден, например, file testzip.zip показывает, что это ZIP-файл, но разархивирование не работает:

Archive:  somerandomname.zip
  End-of-central-directory signature not found.  Either this file is not
  a zipfile, or it constitutes one disk of a multi-part archive.  In the
  latter case the central directory and zipfile comment will be found on
  the last disk(s) of this archive.
unzip:  cannot find zipfile directory in one of somerandomname.zip or
    somerandomname.zip.zip, and cannot find somerandomname.zip.ZIP, period.

Это код

func testThis() error {
pipeReader, pipeWriter := io.Pipe()

zipWriter := zip.NewWriter(pipeWriter)
wg := sync.WaitGroup{}
wg.Add(2)

go func() {

    defer wg.Done()
    defer zipWriter.Close()
    defer pipeWriter.Close()

    header := &zip.FileHeader{
        Name:         "testzip.zip",
        Method:       zip.Deflate,
        ModifiedTime: uint16(time.Now().UnixNano()),
        ModifiedDate: uint16(time.Now().UnixNano()),
    }

    fw, err := zipWriter.CreateHeader(header)


    if err != nil {
        fmt.Println("err")
    }

    object, err := minioClient.GetObject("test", "somekey", minio.GetObjectOptions{})
    if err != nil {
        fmt.Println("err", err)
    }

    if _, err := io.Copy(fw, object); err != nil {
        fmt.Println(err)
    }

}()

go func() {
    defer wg.Done()

    if _, err := io.Copy(os.Stdout, pipeReader); err != nil {
        fmt.Println("err", err)
    }

    _, err := minioClient.PutObject("test", "testzip.zip", pipeReader, -1, minio.PutObjectOptions{})
    if err != nil {
        fmt.Println(err)
    }
}()

wg.Wait()

return nil
}

Любая помощь будет принята с благодарностью

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...