Я пытался использовать MemoryStorageProvider.Но похоже, что он не работает для большинства файлов, кроме меньших.
Я предложил другое решение, которое расширяет AbstractStorageProvider с помощью облачного хранилища Google, и оно прекрасно работает.
https://gist.github.com/azimbabu/0aef75192c385c6d4461118583b6d22f
<code>import com.google.appengine.tools.cloudstorage.GcsFileOptions;
import com.google.appengine.tools.cloudstorage.GcsFilename;
import com.google.appengine.tools.cloudstorage.GcsInputChannel;
import com.google.appengine.tools.cloudstorage.GcsOutputChannel;
import com.google.appengine.tools.cloudstorage.GcsService;
import lombok.extern.slf4j.Slf4j;
import org.apache.james.mime4j.storage.AbstractStorageProvider;
import org.apache.james.mime4j.storage.Storage;
import org.apache.james.mime4j.storage.StorageOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.channels.Channels;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.UUID;
/**
* A {@link org.apache.james.mime4j.storage.StorageProvider} that stores the data in google cloud storage files. The files
* are stored in a user specified bucket. User of this class needs to supply the google cloud storage service and bucket name.
*
* This implementation is based on {@link org.apache.james.mime4j.storage.TempFileStorageProvider}
* <p>
* Example usage:
*
* <pre>
* final String bucketName = "my-bucket";
* DefaultStorageProvider.setInstance(new GcsStorageProvider(gcsService, bucketName));
*
* / @ Открытый класс Slf4j GcsStorageProvider extends AbstractStorageProvider {private static final int FETCH_SIZE_MB = 4 *1024* 1024;приватная статическая конечная строка String PUBLIC_READ = "public-read";private static final GcsFileOptions gcsFileOpts = new GcsFileOptions.Builder (). acl (PUBLIC_READ) .mimeType ("text / csv"). build ();приватный финал GcsService gcsService;приватный финал String bucketName;/ ** * Создает новый
GcsStorageProvider
, используя заданные * значения.* * @param gcsService - реализация {@link GcsService} * @param bucketName имени хранилища облачного хранилища Google для использования.* / public GcsStorageProvider (final GcsService gcsService, final String bucketName) {this.gcsService = gcsService;this.bucketName = bucketName;} @Override public StorageOutputStream createStorageOutputStream () throws IOException {return new GcsStorageProvider.GcsStorageOutputStream (gcsService, bucketName);} закрытый статический финальный класс GcsStorage реализует Storage {private final GcsService gcsService;личное GcsFilename gcsFilename;приватный статический финал Set filesToDelete = new HashSet ();public GcsStorage (final GcsService gcsService, final GcsFilename gcsFilename) {this.gcsService = gcsService;this.gcsFilename = gcsFilename;} @Override public InputStream getInputStream () создает IOException {if (this.gcsFilename == null) {throw new IllegalStateException («хранилище удалено»);} else {final GcsInputChannel readChannel = gcsService.openPrefetchingReadChannel (gcsFilename, 0, FETCH_SIZE_MB);return Channels.newInputStream (readChannel);}} @Override public void delete () {synchronized (filesToDelete) {if (this.gcsFilename! = Null) {filesToDelete.add (this.gcsFilename);this.gcsFilename = null;} final Iterator iterator = filesToDelete.iterator ();while (iterator.hasNext ()) {GcsFilename filename = (GcsFilename) iterator.next ();try {if (gcsService.delete (filename)) {iterator.remove ();}} catch (final IOException ex) {log.error (ex.getMessage (), ex);}}}}} частный статический конечный класс GcsStorageOutputStream extends StorageOutputStream {частный конечный GcsService gcsService;личное GcsFilename gcsFilename;приватный финал OutputStream outputStream;public GcsStorageOutputStream (final GcsService gcsService, final String bucketName) выдает IOException {this.gcsService = gcsService;final String fileName = UUID.randomUUID (). toString ();this.gcsFilename = new GcsFilename (bucketName, fileName);GcsOutputChannel gcsOutputChannel = gcsService.createOrReplace (gcsFilename, gcsFileOpts);this.outputStream = Channels.newOutputStream (gcsOutputChannel);} @Override защищенный void write0 (буфер byte [], смещение int, длина int) создает IOException {this.outputStream.write (буфер, смещение, длина);} @Override защищенное хранилище toStorage0 () выдает IOException {return new GcsStorage (gcsService, gcsFilename);} @Override public void close () создает IOException {super.close ();
this.outputStream.close ();
}
}
}