Загрузите zip-файл с помощью groovy

Мне нужно загрузить zip-файл с URL-адреса с помощью groovy.

Тестовый URL: https://gist.github.com/daicham/5ac8461b8b49385244aa0977638c3420/archive/17a929502e6dda24d0ecfd5bb816c78a2bd5a088.zip

Что я сделал до сих пор:

def static downloadArtifacts(url,filename) {
        new URL(url).openConnection().with { conn ->
            conn.setRequestProperty("PRIVATE-TOKEN", "xxxx")
            url = conn.getHeaderField( "Location" )
            if( !url ) {
                new File((String)filename ).withOutputStream { out ->
                    conn.inputStream.with { inp ->
                        out << inp
                        inp.close()
                    }
                }
            }
        }
    }

Но при открытии загруженного zip-файла выдает ошибку «Произошла ошибка при загрузке архива».

Любая помощь приветствуется.

в вашем коде есть странные строки, но он работает нормально. у меня есть zip-файл с .gitlab-ci.yml в нем.

daggett 11.04.2018 16:33

Просмотрите файл в текстовом редакторе (Блокнот, TextEdit, vi) и посмотрите, каково его содержимое. Если это двоичный файл, это мало что вам даст, но, скорее всего, это текстовое представление ошибки, возникшей при загрузке файла. Это может указать вам на то, что вы можете изменить, особенно после того, как @daggett смог успешно получить файл с вашим кодом.

Daniel 11.04.2018 17:11

@Daniel Я обнаружил, что это проблема с фактическим URL-адресом, который я использовал. Я исправил URL-адрес, и теперь он работает. Спасибо за указатель на открытие файла в редакторе. :)

SP. 17.04.2018 15:24
1
3
1 792
3

Ответы 3

Вы можете сделать это с помощью HttpBuilder-NG:

// https://http-builder-ng.github.io/http-builder-ng/
@Grab('io.github.http-builder-ng:http-builder-ng-core:1.0.3')

import groovyx.net.http.HttpBuilder
import groovyx.net.http.optional.Download

def target = 'https://gist.github.com/daicham/5ac8461b8b49385244aa0977638c3420/archive/17a929502e6dda24d0ecfd5bb816c78a2bd5a088.zip'

File file = HttpBuilder.configure {
    request.uri = target
}.get {
    Download.toFile(delegate, new File('a.zip'))
}
URL url2download = new URL(url)
File file = new File(filename)
file.bytes = url2download.bytes
You can do it: 
    
import java.util.zip.ZipEntry
    import java.util.zip.ZipOutputStream
    class SampleZipController {
        def index() { }
        def downloadSampleZip() {
            response.setContentType('APPLICATION/OCTET-STREAM')
            response.setHeader('Content-Disposition', 'Attachment;Filename="example.zip"')
            ZipOutputStream zip = new ZipOutputStream(response.outputStream);
            def file1Entry = new ZipEntry('first_file.txt');
            zip.putNextEntry(file1Entry);
            zip.write("This is the content of the first file".bytes);
            def file2Entry = new ZipEntry('second_file.txt');
            zip.putNextEntry(file2Entry);
            zip.write("This is the content of the second file".bytes);
            zip.close();
        }
    }

Другие вопросы по теме