[ 
https://issues.apache.org/jira/browse/TIKA-2849?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16821995#comment-16821995
 ] 

Jukka Zitting commented on TIKA-2849:
-------------------------------------

How about something like this:

{code:java}
    TikaInputStream tis = TikaInputStream.cast(input);
    if (tis != null && tis.hasFile()) {
        return detect(tis.getFile());
    }

    if (input == null || !hasOleHeader(input)) {
        return MediaType.OCTET_STREAM;
    }

    int maxBytesToSpool = 16 * 1024 * 1024; // Or some configurable limit.
    InputStream lookahead = new LookaheadInputStream(stream, n);
    try {
        tis = new TikaInputStream(lookahead);
        try {
            if (tis.getLength() < maxBytesToSpool) {
                return detect(tis.getFile());
            }
        } finally {
            tis.close();
        }
    } finally {
        lookahead.close();
    }

    return MediaType.OCTET_STREAM;
{code}

> TikaInputStream copies the input stream locally
> -----------------------------------------------
>
>                 Key: TIKA-2849
>                 URL: https://issues.apache.org/jira/browse/TIKA-2849
>             Project: Tika
>          Issue Type: Bug
>    Affects Versions: 1.20
>            Reporter: Boris Petrov
>            Assignee: Tim Allison
>            Priority: Major
>
> When doing "tika.detect(stream, name)" and the stream is a "TikaInputStream", 
> execution gets to "TikaInputStream#getPath" which does a "Files.copy(in, 
> path, REPLACE_EXISTING);" which is very, very bad. This input stream could 
> be, as in our case, an input stream from a network file which is tens or 
> hundreds of gigabytes large. Copying it locally is a huge waste of resources 
> to say the least. Why does it do that and can I make it not do it? Or is this 
> something that has to be fixed in Tika?



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to