Вот моя функция загрузки на стороне сервера:
private static final int BUFFER_SIZE = 2 * 1024 * 1024;
public void processRequest(HttpServletRequest request)
throws ServletException, IOException {
// multipart request
final Part filePart = request.getPart("file");
// some function to get the filename from part
final String name = getFileName(filePart);
// some function to convert the filename to GcsFilename
final GcsFilename fileName = getFileNameGCS(name);
//method to copy file taken from official documentation
GcsFileOptions instance = GcsFileOptions.getDefaultInstance();
GcsOutputChannel outputChannel = gcsService.createOrReplace(fileName, instance);
copy(filePart.getInputStream(), Channels.newOutputStream(outputChannel));
}
private void copy(InputStream input, OutputStream output) throws IOException {
try {
byte[] buffer = new byte[BUFFER_SIZE];
int bytesRead = input.read(buffer);
while (bytesRead != -1) {
output.write(buffer, 0, bytesRead);
bytesRead = input.read(buffer);
}
} finally {
input.close();
output.close();
}
}
Вот моя функция публикации на стороне клиента (Angular2) album.component.ts:
uploadAlbum(index:number){
const formData = new FormData();
formData.append('file', this.targets[index].file, '/gcs/my-bucket/' + index +'/cover/cover.jpg');
this.http.post('/api/photos',formData, {responseType: 'text'}).subscribe(
(data: any) => {
console.log(data)
},
err => {
console.log(err)
}
);
}
теперь я использую этот метод для получения общедоступного URL-адреса моего локального файла (App Engine Google Cloud Storage имитирует загрузку с сервера и помещает его в локальное пространство)
пример кода:
...
BlobKey blobKey = blobStore.createGsBlobKey("/gs/" + bucket + "/" + listFilenames.get(i));
log.info("/gs/" + bucket + "/" + listFilenames.get(i));
ImagesService imagesService = ImagesServiceFactory.getImagesService();
String url = imagesService.getServingUrl(ServingUrlOptions.Builder.withBlobKey(blobKey));
jsonObj.put("path", url);
json.put(jsonObj);
...
В основном то, что я делаю в другой части функции, - это анализ всех файлов и фильтрация того, который меня интересует.
И это работает, я получаю URL с encoded_gs_key
, но ничего не отображается вообще.
Есть ли проблема с моей загрузкой? BlobStore обслуживает ссылку, даже если не находит файл в указанном месте?
Еще одна вещь - я всегда получаю одну и ту же ссылку encoded_gs_key
, даже если мои папки и изображения разные (0/cover/cover.jpg
и, например, 1/cover/cover.jpg
, поэтому разные корневые папки, разные изображения, но одно и то же имя файла)