Jim,

1) The line

text = IOUtils.toString(inputStream, StandardCharsets.UTF_8)

is for reading the whole content in as a UTF-8 encoded string. The
inputStream itself deals in bytes [1] , so you could use available()
and read() to get the binary data.

2) If you are not dealing in strings/text, you won't need the
encoding, so yes I imagine your write() will look the way you have it
above.

Regards,
Matt

[1] https://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html

On Fri, Nov 3, 2017 at 5:48 AM, James McMahon <jsmcmah...@gmail.com> wrote:
> Thank you Andy. I'd like to ask just a few quick follow up questions.
>
> 1- My flow content may be textual characters, and it can also be binary -
> jpgs, pngs, and similar. How can discern binary or character content using
> conditional checks to be sure I handle the file properly? How would I alter
> this
>
> text = IOUtils.toString(inputStream, StandardCharsets.UTF_8)
>
> to read in the data from the stream as binary data in that case?
>
> 2- In the case where my data in the flowfile payload is binary, do I have
> another version of this....
>
> outputStream.write(bytearray(reversedText.encode('utf-8')))
>
> ....that omits the encoding, like so:
>
> outputStream.write(bytearray(some_binary))  ?
>
> Thank you very much in advance. -Jim
>
> On Thu, Nov 2, 2017 at 8:26 PM, Andy LoPresto <alopre...@apache.org> wrote:
>>
>> James,
>>
>> The Python API should be the same as the Java FlowFile.java interface [1].
>> Matt Burgess’ blog has a good post about using Jython to do flowfile content
>> manipulation. Something like:
>>
>> flowFile = session.get()
>> if (flowFile != None):
>>   flowFile = session.write(flowFile,PyStreamCallback())
>>   session.transfer(flowFile, REL_SUCCESS)
>>
>> With PyStreamCallback declared as a class above that block in the script:
>>
>> import java.io
>> from org.apache.commons.io import IOUtils
>> from java.nio.charset import StandardCharsets
>> from org.apache.nifi.processor.io import StreamCallback
>>
>> class PyStreamCallback(StreamCallback):
>>   def __init__(self):
>>         pass
>>   def process(self, inputStream, outputStream):
>>     text = IOUtils.toString(inputStream, StandardCharsets.UTF_8)
>>     reversedText = text[::-1]
>>
>>     outputStream.write(bytearray(reversedText.encode('utf-8')))
>>
>> In Groovy, you can declare the StreamCallback as an inline closure to make
>> this more compact, but I believe in Jython it needs to be a separate
>> declaration. Hope this helps.
>>
>> [1]
>> https://github.com/apache/nifi/blob/master/nifi-api/src/main/java/org/apache/nifi/flowfile/FlowFile.java
>> [2]
>> https://funnifi.blogspot.com/2016/03/executescript-json-to-json-revisited_14.html
>>
>>
>> Andy LoPresto
>> alopre...@apache.org
>> alopresto.apa...@gmail.com
>> PGP Fingerprint: 70EC B3E5 98A6 5A3F D3C4  BACE 3C6E F65B 2F7D EF69
>>
>> On Nov 2, 2017, at 12:53 PM, James McMahon <jsmcmah...@gmail.com> wrote:
>>
>> In python, I can use the requests library to post content something like
>> htis:
>>
>> import requests
>> url="https://abc.test.org";
>> files={'file':open('/somedir/myfile.txt','rb')}
>> r = requests.post(url,files=files)
>>
>> If I am in a python stream callback, how can I read the flowfile payload
>> in the same way that the open() reads its file from disk?
>>
>>
>

Reply via email to