Сохранить изображение в облачном хранилище Google

В настоящее время я работаю над проектом, в котором у нас должна быть возможность загружать файлы в облачное хранилище Google. Итак, мы создали Bucket, и я добавил зависимость Maven в свое локальное «обычное» приложение:

<dependencies>
    <dependency>
        <groupId>com.google.appengine.tools</groupId>
        <artifactId>appengine-gcs-client</artifactId>
        <version>RELEASE</version>
    </dependency>
</dependencies>

Затем я начал читать локальный файл и попытался отправить его в облачное хранилище Google просто в main:

try {
    final GcsService gcsService = GcsServiceFactory
        .createGcsService();

    File file = new File("/tmp/test.jpg");
    FileInputStream fis = new FileInputStream(file);
    GcsFilename fileName = new GcsFilename("test1213","test.jpg");
    GcsOutputChannel outputChannel;
    outputChannel = gcsService.createOrReplace(fileName, GcsFileOptions.getDefaultInstance());
    copy(fis, Channels.newOutputStream(outputChannel));
} catch (IOException e) {
    e.printStackTrace();
}

Мой метод copy выглядит так:

private static final int BUFFER_SIZE = 2 * 1024 * 1024;

private static 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();
    }
}

Все, что я получаю от этого, это:

The API package 'file' or call 'Create()' was not found.

После долгих поисков в google, чтения документации даже поиска в bing я нашел эту запись: Пакет API 'channel' или вызов 'CreateChannel()' не найден

В нем говорится, что невозможно использовать appengine.tools -> gcs-client без такого приложения AppEngine. Но есть ли простой способ загружать файлы в облачное хранилище Google без необходимости использовать службу AppEngine?


person DominikAngerer    schedule 06.11.2014    source источник


Ответы (2)


Похоже, вы не используете App Engine. Это совершенно нормально. Google Cloud Storage может нормально работать с App Engine, но ни в коем случае не требует этого. Однако для пакета appengine-gcs-client, который вы пытаетесь использовать, требуется App Engine.

Вместо этого вам нужно хранилище google-api-services.

Здесь приведен пример использования GCS JSON API с Java и Maven:

https://cloud.google.com/storage/docs/json_api/v1/json-api-java-samples

person Brandon Yarbrough    schedule 07.11.2014
comment
Спасибо за этот пример, я посмотрю на него сегодня днем ​​или на следующей неделе. Попробовав и поиграв с этим json-api, я вернусь! +1 за быструю помощь на данный момент :) - person DominikAngerer; 07.11.2014

Вот код для моего сервлета APP Engine, который возвращает данные и фотографии, а затем сохраняет их в хранилище данных и облачном хранилище. Надеюсь, это поможет вам ..

@Override
          public void doPost(HttpServletRequest req, HttpServletResponse res)
              throws ServletException, IOException {            

            //Get GCS service
            GcsService gcsService = GcsServiceFactory.createGcsService();

            //Generate string for my photo
            String unique = UUID.randomUUID().toString();     

            //Open GCS File
            GcsFilename filename = new GcsFilename(CONSTANTES.BUCKETNAME, unique+".jpg");               

            //Set Option for that file
            GcsFileOptions options = new GcsFileOptions.Builder()
                    .mimeType("image/jpg")
                    .acl("public-read")
                    .build();


            //Canal to write on it
            GcsOutputChannel writeChannel = gcsService.createOrReplace(filename, options);

            //For multipart support
            ServletFileUpload upload = new ServletFileUpload(); 

            //Trying to create file   
            try {


                FileItemIterator iterator = upload.getItemIterator(req);


                    while (iterator.hasNext()) {
                        FileItemStream item = iterator.next();                      
                        InputStream stream = item.openStream();

                        if (item.isFormField()) {                       

                          String texte_recu_filtre = IOUtils.toString(stream);                       

                          if (item.getFieldName().equals("Type")){
                              Type=Integer.parseInt(texte_recu_filtre);                           
                          }else if (item.getFieldName().equals("DateHeure")){
                              DateHeure=texte_recu_filtre;
                          }else if (item.getFieldName().equals("NumPort")){
                              NumPort=texte_recu_filtre;
                          }else if (item.getFieldName().equals("CodePays")){
                              CodePays=Integer.parseInt(texte_recu_filtre);
                          }

                        } else {                    


                          byte[] bytes = ByteStreams.toByteArray(stream);

                          try {
                                //Write data from photo
                                writeChannel.write(ByteBuffer.wrap(bytes));                             

                          } finally {                             

                                writeChannel.close();
                                stream.close();

                                /
                                res.setStatus(HttpServletResponse.SC_CREATED);

                                res.setContentType("text/plain");
                          }        
                        }        
                  }



                Key<Utilisateur> cleUtilisateur = Key.create(Utilisateur.class, NumPort);               


                Utilisateur posteur = ofy().load().key(cleUtilisateur).now();               

                //Add to datatstore with Objectify
                Campagne photo_uploaded = new Campagne(CONSTANTES.chaineToDelete+unique+".jpg", Type, date_prise_photo, 0, cleUtilisateur, CodePays, posteur.getliste_contact());

                ofy().save().entity(photo_uploaded).now();                          


                } catch (FileUploadException e) {

                    e.printStackTrace();
                }               

         } 
person Phil    schedule 07.11.2014
comment
спасибо, Фил, проблема в том, что я не использую App Engine и пока не хочу его использовать - я также пытался использовать его, как и вы, но проблема в том, что для запуска этого примера мне нужно использовать приложение Движок от Google. - но спасибо. - person DominikAngerer; 09.11.2014