локальная загрузка изображений не отображается в Google App Engine - PullRequest
0 голосов
/ 05 мая 2019

Вот моя функция загрузки на стороне сервера:

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, поэтому разные корневые папки, разные изображения, но одно и то же имя файла)

1 Ответ

1 голос
/ 06 мая 2019

Теперь я понимаю, что случилось.У меня был фильтр подключения, который позволял мне проходить только по этому пути /api* Я удалил его, и кажется, что все работает лучше:

оригинальный класс connexionFilter:

public class connexionFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        String path = ((HttpServletRequest) request).getRequestURI();

        if(path.startsWith("/api"))
        {
            chain.doFilter(req, resp);
        }
    }

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

}
...