如何使用Java上传文件到Google云存储

10

我已经尝试了很长时间使用Java上传文件至Google云存储。通过谷歌搜索,我找到了以下代码,但是无法完全理解。请问有人能够定制这段代码以实现向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("user-administrator@example.com").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();

你能描述一下你看到的错误吗? - Travis Hobrla
我不了解上传的概念。所以我有点困惑,不知道如何自定义上传文件。 - Sreekanth
2个回答

8

使用Java访问Google Cloud Storage的推荐方法是使用Cloud Storage Client Libraries

此客户端的GitHub页面提供了多个示例和资源,以便学习如何正确使用它。

它还提供了以下代码示例,演示如何使用客户端库将对象上传到Google Cloud Storage:

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));

1
你能否提供一个从InputStream上传2GB文件的流式传输示例? - ndtreviv
你知道如何将文件上传到存储桶的特定文件夹中吗? - Fizik26
1
@Fizik26 在 Google Cloud 存储中,实际上不存在文件夹。只需在上传对象的名称中指定“文件夹”路径即可。参考:https://cloud.google.com/storage/docs/key-terms#object-names - Yannick MG

1

我也尝试使用GCS,但对我没有起作用。最终,我使用了ServletFileUpload类。以下是我编写的代码,用于创建Google Bucket并将用户选择的文件上传到该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");
    }




}

我已将整个源代码上传至GitHub


很好。为了完整的示例,您如何调用各种POST方法 - 如何在Java中创建HttpServletRequest和HttpServletResponse?谢谢。 - nsandersen
@nsandersen:对此,我建议通过Spring MVC框架进行。我使用该框架创建了整个应用程序。 - Yash Bansal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接