2

org.apache.commons.fileupload を使用してファイル
クラスをアップロードします StorageService はクラウド ストレージ API を使用してファイルを保存するサービスです これは私のコードです

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

ローカルでは問題なく動作しますが、アプリをデプロイするとエラーが発生します
助けてください!

4

1 に答える 1

1

編集権限を持つチームにサービス アカウントを追加するか、バケット ACL を更新してサービス アカウントに書き込みアクセス権を明示的に付与することにより、アプリのサービス アカウントに問題のバケットへの書き込みアクセス権があることを確認してください。詳細については、この質問を参照してください。

于 2013-01-10T00:41:15.800 に答える