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

确保您的应用程序的服务帐户具有对相关存储桶的 WRITE 访问权限,方法是将该服务帐户添加到具有可编辑权限的团队,或者更新存储桶 acl 以明确授予服务帐户 WRITE 访问权限。有关更多详细信息,请参阅此问题

于 2013-01-10T00:41:15.800 回答