MY first thought was “are you SURE it is a kosher Zip file?”

Sometimes one gets ‘odd’ gzip files masquerading as plain zip files.

Also, apparently “java.util.Zip does not support DEFLATE64 compression method.” 
: 
https://www.ibm.com/support/pages/zip-file-fails-route-invalid-compression-method-error

IF this is the case, you may need to use: 
https://commons.apache.org/proper/commons-compress/zip.html
(maybe worth looking at the “Known Interoperability Problems” section of the 
above doc)

May be helpful: https://stackoverflow.com/a/76321625

HTH

BOB

From: James McMahon <jsmcmah...@gmail.com>
Sent: Saturday, February 17, 2024 4:20 AM
To: users@groovy.apache.org
Subject: Re: Cannot process zip file with Groovy

Hello Paul, and thanks again for taking a moment to look at this. I tried as 
you suggested:
- - - - - - - - - -
import java.util.zip.ZipInputStream

def ff = session.get()
if (!ff) return

try {
    ff = session.write(ff, { inputStream, outputStream ->
        def zipInputStream = new ZipInputStream(inputStream)
        def entry = zipInputStream.getNextEntry()
        while (entry != null) {
            entry = zipInputStream.getNextEntry()
        }
        outputStream = inputStream
    } as StreamCallback)

    session.transfer(ff, REL_SUCCESS)
} catch (Exception e) {
    log.error('Error occurred processing FlowFile', e)
    session.transfer(ff, REL_FAILURE)
}
- - - - - - - - - -

Once again it threw this error and failed:


ExecuteScript[id=ae3e5de5-018d-1000-ff81-b0c807b75086] Error occurred 
processing FlowFile: org.apache.nifi.processor.exception.ProcessException: 
IOException thrown from ExecuteScript[id=ae3e5de5-018d-1000-ff81-b0c807b75086]: 
java.util.zip.ZipException: invalid compression method

- Caused by: java.util.zip.ZipException: invalid compression method



It bears repeating: I am able to list and unzip the file at the linux command 
line, but cannot get it to work from the script.



What is interesting (and a little frustrating) is that the NiFi UnpackContent 
will successfully unzip the zip file. However, the reason I am trying to do it 
in Groovy is that UnpackContent exposes the file metadata for each file in a 
tar archive - lastModifiedDate, for example - but it does not do so for files 
extracted from zips. And I need that metadata. So here I be.



Can I explicitly set my (de)compression in the Groovy script? Where would I do 
that, and what values does one typically encounter for zip compression?



Jim

On Thu, Feb 15, 2024 at 9:26 PM Paul King 
<pa...@asert.com.au<mailto:pa...@asert.com.au>> wrote:
What you are doing to read the zip looks okay.

Just a guess, but it could be that because you haven't written to the
output stream, it is essentially a corrupt data stream as far as NiFi
processing is concerned. What happens if you set "outputStream =
inputStream" as the last line of your callback?

Paul.

<https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail>
Virus-free.www.avast.com<http://Virus-free.www.avast.com>
<https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail>
<#DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2>

On Fri, Feb 16, 2024 at 8:48 AM James McMahon 
<jsmcmah...@gmail.com<mailto:jsmcmah...@gmail.com>> wrote:
>
> I am struggling to build a Groovy scri[t I can run from a NiFi ExecuteScript 
> processor to extract from a zip file and stream to a tar archive.
>
> I tried to tackle it all at once and made little progress.
> I am now just trying to read the zip file, and am getting this error:
>
> ExecuteScript[id=ae3e5de5-018d-1000-ff81-b0c807b75086] Error occurred 
> processing FlowFile: org.apache.nifi.processor.exception.ProcessException: 
> IOException thrown from 
> ExecuteScript[id=ae3e5de5-018d-1000-ff81-b0c807b75086]: 
> java.util.zip.ZipException: invalid compression method
> - Caused by: java.util.zip.ZipException: invalid compression method
>
>
> This is my simplified code:
>
>
> import java.util.zip.ZipInputStream
>
> def ff = session.get()
> if (!ff) return
>
> try {
>     ff = session.write(ff, { inputStream, outputStream ->
>         def zipInputStream = new ZipInputStream(inputStream)
>         def entry = zipInputStream.getNextEntry()
>         while (entry != null) {
>             entry = zipInputStream.getNextEntry()
>         }
>     } as StreamCallback)
>
>     session.transfer(ff, REL_SUCCESS)
> } catch (Exception e) {
>     log.error('Error occurred processing FlowFile', e)
>     session.transfer(ff, REL_FAILURE)
> }
>
>
> I am able to list and unzip the file at the linux command line, but cannot 
> get it to work from the script.
>
>
> Has anyone had success doing this? Can anyone help me get past this error?
>
>
> Thanks in advance.
>
> Jim
>
>

Reply via email to