How can I get MIME type of an InputStream of a file that is being uploaded?

Если Ваш imageList имеет список попытки объектов изображения следующий

$ {createLinkTo (dir: 'изображения', файл: image.filename)}.

, Если Ваши imageList как это ['1.jpg', '2.jpg', '3.jpg'] пробуют следующий

**${createLinkTo(dir: 'images', file: image)}**
25
задан Raedwald 30 September 2013 в 17:02
поделиться

4 ответа

Это зависит от того, откуда вы получаете входной поток. Если вы получаете его из сервлета, то он доступен через объект HttpServerRequest, который является аргументом doPost. Если вы используете какой-то API отдыха, например, Джерси, запрос может быть введен с помощью @Context. Если вы загружаете файл через сокет, вы будете обязаны указать тип MIME как часть вашего протокола, поскольку вы не будете наследовать заголовки http.

6
ответ дан 28 November 2019 в 21:50
поделиться

Вы можете просто добавить tika-app-1.x.jar в ваш путь к классу, если вы не используете ведение журнала slf4j где-либо еще, потому что это вызовет конфликт. Если вы используете тика для обнаружения входного потока, он должен быть помечен как поддерживаемый. В противном случае, вызов тика сотрет ваш поток ввода. Однако, если вы используете библиотеку Apache IO, чтобы обойти это, и просто превратите InputStream в файл в памяти.

import org.apache.tika.*;

Tike tika = new Tika();
InputStream in = null;
FileOutputStream out = null;
try{
   out = new FileOutputStream(c:/tmp.tmp);
   IOUtils.copy(in, out);
   String mimeType = tika.detect(out);
}catch(Exception e){
   System.err.println(e);
} finally {
   if(null != in) 
       in.close();
   if(null != out)
       out.close();
 }
1
ответ дан 28 November 2019 в 21:50
поделиться

Я думаю, что это решает проблему:

    public String readIt(InputStream is) {
    if (is != null) {
            BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"), 8);

            StringBuilder sb = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                sb.append(line).append("\n");
            }
            is.close();
            return sb.toString();
    }
    return "error: ";
}        

Что это возвращает? Например, для png: «♦ PNG \ n \ n ♦♦♦ .....», для xml:

Довольно полезно, вы не можете попробовать string.contains (), чтобы проверить, что это такое

-4
ответ дан 28 November 2019 в 21:50
поделиться

Я - крупный сторонник, "делают это самостоятельно сначала, затем ищут решение библиотеки". К счастью этот случай - просто это.

необходимо знать "магическое число" файла, т.е. его подпись. Позвольте мне дать пример для обнаружения, представляет ли эти InputStream файл PNG.

подпись PNG составлена путем добавления вместе следующего в ШЕСТНАДЦАТЕРИЧНОМ ЧИСЛЕ:

1) байт проверки ошибок

2) строка "PNG" как в ASCII:

     P - 0x50
     N - 0x4E
     G - 0x47

3) CR (возврат каретки) - 0x0D

4) LF (перевод строки) - 0xA

5) SUB (замена) - 0x1A

6) LF (перевод строки) - 0xA

Так, магическое число

89   50 4E 47 0D 0A 1A 0A

137  80 78 71 13 10 26 10 (decimal)
-119 80 78 71 13 10 26 10 (in Java)

Объяснение [1 112] преобразование

, число бита Н может использоваться для представления 2^N различные значения. Для байта (8 биты), который является 2^8=256, или 0..255 диапазон. Java полагает, что примитивы байта подписываются , так, чтобы диапазон был -128..127. Таким образом, 137 считается подпалившим, и представьте -119 = 137 - 256.

Пример в Koltin

private fun InputStream.isPng(): Boolean {
    val magicNumbers = intArrayOf(-119, 80, 78, 71, 13, 10, 26, 10)
    val signatureBytes = ByteArray(magicNumbers.size)
    read(signatureBytes, 0, signatureBytes.size)
    return signatureBytes.map { it.toInt() }.toIntArray().contentEquals(magicNumbers)
}

, Конечно, для поддержки многих типов MIME, необходимо масштабировать это решение так или иначе, и если Вы не довольны результатом, рассматриваете некоторую библиотеку.

0
ответ дан 28 November 2019 в 21:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: