How to upload a file in the google cloud storage using java

19,817

Solution 1

The recommended way to use Google Cloud Storage from Java is to use the Cloud Storage Client Libraries.

The GitHub page for this client gives several examples and resources to learn how to use it properly.

It also gives this code sample as an example of how to upload objects to Google Cloud Storage using the client library:

import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;
import static java.nio.charset.StandardCharsets.UTF_8;
import com.google.cloud.storage.Blob;
import com.google.cloud.storage.Bucket;
import com.google.cloud.storage.BucketInfo;

// Create your service object
Storage storage = StorageOptions.getDefaultInstance().getService();

// Create a bucket
String bucketName = "my_unique_bucket"; // Change this to something unique
Bucket bucket = storage.create(BucketInfo.of(bucketName));

// Upload a blob to the newly created bucket
BlobId blobId = BlobId.of(bucketName, "my_blob_name");
BlobInfo blobInfo = BlobInfo.newBuilder(blobId).setContentType("text/plain").build();
Blob blob = storage.create(blobInfo, "a simple blob".getBytes(UTF_8));

Solution 2

I also tried with using GCS, but it did not worked for me. Finally, I did with using ServletFileUpload class. Below is the code that I wrote in order to create Google Bucket and to upload the file selected by the user, to that Bucket:

package com1.KT1;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;

import com.google.cloud.storage.Bucket;
import com.google.cloud.storage.BucketInfo;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;
import com.google.cloud.storage.Blob;
import com.google.cloud.storage.BlobId;


public class TestBucket extends HttpServlet {
    private static final long serialVersionUID = 1L;


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        response.getWriter().append("Served at: ").append(request.getContextPath());
    }


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        // Instantiates a client
        String targetFileStr ="";
        List<FileItem> fileName = null;
        Storage storage = StorageOptions.getDefaultInstance().getService();

        // The name for the new bucket
        String bucketName = "vendor-bucket13";  // "my-new-bucket";

        // Creates the new bucket
        Bucket bucket = storage.create(BucketInfo.of(bucketName));


        //Object requestedFile = request.getParameter("filename");


        ServletFileUpload sfu = new ServletFileUpload(new DiskFileItemFactory());
        try {
             fileName = sfu.parseRequest(request);
             for(FileItem f:fileName)
                {
                try {
                    f.write (new File("/Users/tkmajdt/Documents/workspace/File1POC1/" + f.getName()));
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                //targetFileStr = readFile("/Users/tkmajdt/Documents/workspace/File1POC1/" + f.getName(),Charset.defaultCharset());
                targetFileStr = new String(Files.readAllBytes(Paths.get("/Users/tkmajdt/Documents/workspace/File1POC1/" + f.getName())));
                }
        } 

    //response.getWriter().print("File Uploaded Successfully");


//String content = readFile("test.txt", Charset.defaultCharset());

        catch (FileUploadException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }



        /*if(requestedFile==null)
        {
            response.getWriter().print("File Not Found");
        }*/
        /*else
        {
            //String fileName = (String)requestedFile;
            FileInputStream fisTargetFile = new FileInputStream(fileName);

            targetFileStr = IOUtils.toString(fisTargetFile, "UTF-8");
        }*/



        BlobId blobId = BlobId.of(bucketName, "my_blob_name");
        //Blob blob = bucket.create("my_blob_name", "a simple blob".getBytes("UTF-8"), "text/plain");
        Blob blob = bucket.create("my_blob_name", targetFileStr.getBytes("UTF-8"), "text/plain");

        //storage.delete("vendor-bucket3");
    }




}

I uploaded the whole source code to GitHub

Share:
19,817
Sreekanth
Author by

Sreekanth

Updated on July 25, 2022

Comments

  • Sreekanth
    Sreekanth almost 2 years

    I have been trying for a long time to upload a file in the Google cloud store using java. By goggling I have found this code, but cant able to understand exactly. Can anyone please customize this one to upload a file in the GCS?

    // Given
    InputStream inputStream;  // object data, e.g., FileInputStream
    long byteCount;  // size of input stream
    
    InputStreamContent mediaContent = new InputStreamContent("application/octet-stream", inputStream);
    // Knowing the stream length allows server-side optimization, and client-side progress
    // reporting with a MediaHttpUploaderProgressListener.
    mediaContent.setLength(byteCount);
    
    StorageObject objectMetadata = null;
    
    if (useCustomMetadata) {
      // If you have custom settings for metadata on the object you want to set
      // then you can allocate a StorageObject and set the values here. You can
      // leave out setBucket(), since the bucket is in the insert command's
      // parameters.
      objectMetadata = new StorageObject()
          .setName("myobject")
          .setMetadata(ImmutableMap.of("key1", "value1", "key2", "value2"))
          .setAcl(ImmutableList.of(
              new ObjectAccessControl().setEntity("domain-example.com").setRole("READER"),
              new ObjectAccessControl().setEntity("[email protected]").setRole("OWNER")
              ))
          .setContentDisposition("attachment");
    }
    
    Storage.Objects.Insert insertObject = storage.objects().insert("mybucket", objectMetadata,
        mediaContent);
    
    if (!useCustomMetadata) {
      // If you don't provide metadata, you will have specify the object
      // name by parameter. You will probably also want to ensure that your
      // default object ACLs (a bucket property) are set appropriately:
      // https://developers.google.com/storage/docs/json_api/v1/buckets#defaultObjectAcl
      insertObject.setName("myobject");
    }
    
    // For small files, you may wish to call setDirectUploadEnabled(true), to
    // reduce the number of HTTP requests made to the server.
    if (mediaContent.getLength() > 0 && mediaContent.getLength() <= 2 * 1000 * 1000 /* 2MB */) {
      insertObject.getMediaHttpUploader().setDirectUploadEnabled(true);
    }
    
    insertObject.execute();