2016-02-15 3 views
1

Я использую файл, загруженный из хранилища Gcloud в качестве приложения к API Mandrill для отправки в виде вложения по электронной почте. Проблема в том, что он работает только для текстового файла , но для изображения или Pdf вложение повреждено. Следующий код предназначен для загрузки файла и преобразования его в кодировку Base64.Изображение или Pdf загрузка файла из Gcloud Хранение повреждено

Storage.Objects.Get getObject = getService().objects().get(bucket, object); 

    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    // If you're not in AppEngine, download the whole thing in one request, if possible. 
    getObject.getMediaHttpDownloader().setDirectDownloadEnabled(true); 
    getObject.executeMediaAndDownloadTo(out); 
    //log.info("Output: {}", out.toString("UTF-8")); 
    return Base64.encodeBase64URLSafeString(out.toString("UTF-8") 
     .getBytes(StandardCharsets.UTF_8)); 

Я устанавливаю эту строку в Содержимое MessageContent API Mandrill.

+0

Поскольку MessageContent.Content ожидает строку, а не байт массива, я предполагаю, что вы передаете base64.encodeBase64URLSafeString (out.toString ("UTF-8")) в качестве MessageContent, но только с помощью GetBytes() здесь, чтобы проверить коррупция? – Adam

+0

Да, это причина, почему я использую base64.encodeBase64URLSafeString, но я также попробовал Base64.encodeBase64URLSafeString (out.toByteArray()), который дает тот же результат. Повреждены только текстовые файлы. – pradex

+1

Я считаю, что проблема заключается в загрузке полных данных за один раз. Потому что с большим количеством тестов я вижу, что большие текстовые файлы также не извлекают все данные, поскольку некоторые части повреждены. – pradex

ответ

0

Got it working. Мне нужно было только сохранить OutputStream во временном файле, прежде чем использовать его в виде вложения в письме. Отправьте код ниже для справки.

Storage.Objects.Get getObject = storage.objects().get("bucket", "object"); 

OutputStream out = new FileOutputStream("/tmp/object"); 
// If you're not in AppEngine, download the whole thing in one request, if possible. 
getObject.getMediaHttpDownloader().setDirectDownloadEnabled(true); 
getObject.executeMediaAndDownloadTo(out); 
Смежные вопросы