Вы преобразовываете поток двоичных данных в строку в строке
contentFile = Streams.asString(is);
Не делайте этого.Это преобразование использует набор символов и декодирует байты в символы, но, безусловно, завершается ошибкой, поскольку поток не содержит допустимых символов этого набора символов.Если это двоичный файл, сохраните его как двоичный файл (в поток или байтовый массив):
InputStream fileContent;
// ...
else {
filename = FilenameUtils.getName(itemStream.getName());
fileContent = is;
}
// ...
ds = new ByteArrayDataSource(fileContent, "image/jpeg");
attachment.setDataHandler(new DataHandler(ds));