[
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)