thoitbk
thoitbk

Reputation: 269

How to upload file to google cloud storage using java?

I use org.apache.commons.fileupload to upload file
class StorageService is a service that use cloud storage APIs to store file This is my code

public class UploadFileAction extends org.apache.struts.action.Action {

private static final String SUCCESS = "success";
private StorageService storage = new StorageService();
private static final int BUFFER_SIZE = 1024 * 1024;

@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
        HttpServletRequest request, HttpServletResponse response)
        throws Exception {

    ServletFileUpload upload = new ServletFileUpload();
    FileItemIterator iter = upload.getItemIterator(request);
    while (iter.hasNext()) {
        FileItemStream item = iter.next();
        String fileName = item.getName();
        String mime = item.getContentType();
        storage.init(fileName, mime);
        InputStream is = item.openStream();

        byte[] b = new byte[BUFFER_SIZE];
        int readBytes = is.read(b, 0, BUFFER_SIZE);
        while (readBytes != -1) {
            storage.storeFile(b, BUFFER_SIZE);
            readBytes = is.read(b, 0, readBytes);
        }

        is.close();
        storage.destroy();
    }

    return mapping.findForward(SUCCESS);
}
}

package storageservice;

import com.google.appengine.api.files.*;
import com.google.appengine.api.files.GSFileOptions.GSFileOptionsBuilder;
import java.io.*;
import java.nio.channels.Channels;

public class StorageService {

private static final String BUCKET_NAME = "thoitbk";

private FileWriteChannel writeChannel = null;
private OutputStream os = null;

public void init(String fileName, String mime) throws Exception {
    FileService fileService = FileServiceFactory.getFileService();
    GSFileOptionsBuilder builder = new GSFileOptionsBuilder()
            .setAcl("public_read")
            .setBucket(BUCKET_NAME)
            .setKey(fileName)
            .setMimeType(mime);
    AppEngineFile writableFile = fileService.createNewGSFile(builder.build());
    boolean lock = true;
    writeChannel = fileService.openWriteChannel(writableFile, lock);
    os = Channels.newOutputStream(writeChannel);
}

public void storeFile(byte[] b, int readSize) throws Exception {
    os.write(b, 0, readSize);
    os.flush();
}

public void destroy() throws Exception {
    os.close();
    writeChannel.closeFinally();
}
}

In local this works fine but error when I deploy my app
Please help me!

Upvotes: 2

Views: 6295

Answers (1)

fejta
fejta

Reputation: 3121

Make sure your app's service account has WRITE access to the bucket in question, either by adding the service account to the team with can edit rights or else update the bucket acl to explicitly grant the service account WRITE access. See this question for more details.

Upvotes: 1

Related Questions