2012-04-28 29 views
2

私はこれが正常に動作しますが、エラー時にIローカルでJavaを使用してGoogle Cloud Storageにファイルをアップロードするにはどうすればよいですか?

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


クラスStorageServiceがストアファイルへのクラウドストレージAPIを使用するサービス である。これは私のコードでファイルをアップロードするorg.apache.commons.fileuploadを使用私のアプリを展開
私を助けてください!

+0

このプログラムで使用したクラスがGAE [ここ](https://developers.google.com/appengine/docs/java/jrewhitelist)でサポートされていることを確認してください。 –

+0

エラーは何を表示しますか? –

+0

あなたの問題を解決しましたか?これは、32MBを超えるファイルでは機能しないためです。お願いします :-( – Aerox

答えて

1

でサービスアカウントを追加するか、権限を編集するか、明示的にサービスアカウントWRITEアクセスを許可するバケットaclを更新するかのいずれかで、問題のバケットに対するWRITEアクセスがアプリのサービスアカウントにあることを確認してください。詳細は、this questionを参照してください。

関連する問題