-1

Google appengine にあるプロジェクト ディレクトリにファイルをアップロードするには、Apache Streaming APIGoogle App Engine Virtual File Systemを使用しようとしています。これが私が今までできたことです:

    String path = request.getParameter("Data");
    PrintWriter writer = response.getWriter();
     try {
       boolean isMultipart = ServletFileUpload.isMultipartContent(request);
       if( !isMultipart ) {
           writer.println("File cannot be uploaded !");
       }
       else {
           ServletFileUpload upload = new ServletFileUpload();
           FileItemIterator iter = upload.getItemIterator(request);
           List list = null;
           while(iter.hasNext()) {
               FileItemStream item = iter.next();
               String name  = item.getFieldName();
               String fileName = item.getName();
               InputStream stream = item.openStream();
               if(item.isFormField()) {
                   // Process regular form field (input type="text|radio|checkbox|etc", select, etc).
               } else {
                   GaeVFS.setRootPath( getServletContext().getRealPath("/") );
                   FileSystemManager fsManager = GaeVFS.getManager();
                   //....NOW WHAT....

               }
           }
       }

私はelseブロックで立ち往生しています。今すぐ続行するには?プロジェクトのuploadsという名前のディレクトリにファイルを書き込む必要があります。

4

1 に答える 1

2

GAE ファイルシステムは読み取り専用です。API 経由の書き込みアクセスはありません。ファイルシステムの内容を変更する唯一の方法は、appcfg.

データをアップロードして保存する必要がある場合は、BlobstoreまたはGoogle Cloud Storageを使用してください。

ブロブストアにアップロード:

String path = request.getParameter("Data");
PrintWriter writer = response.getWriter();
 try {
   boolean isMultipart = ServletFileUpload.isMultipartContent(request);
   if( !isMultipart ) {
       writer.println("File cannot be uploaded !");
   }
   else {
       ServletFileUpload upload = new ServletFileUpload();
       FileItemIterator iter = upload.getItemIterator(request);
       List list = null;
       while(iter.hasNext()) {
           FileItemStream item = iter.next();
           String name  = item.getFieldName();
           String fileName = item.getName();
           InputStream stream = item.openStream();
           if(item.isFormField()) {
               // Process regular form field (input type="text|radio|checkbox|etc", select, etc).
           } else {

            // Get a file service
            FileService fileService = FileServiceFactory.getFileService();

            // Create a new Blob file with mime-type "text/plain"
            AppEngineFile file = fileService.createNewBlobFile(mimeType, filename);

            // Open a channel to write to it
            boolean lock = true;
            FileWriteChannel writeChannel = fileService.openWriteChannel(file, lock);

            // copy byte stream from request to channel
            byte[] buffer = new byte[10000];
            int len;
            while ((len = stream.read(buffer)) > 0) {
                writeChannel.write(ByteBuffer.wrap(buffer, 0, len));
            }

            writeChannel.closeFinally();

            // here your data is saved to blobstore
            // you should now save a blobstore key somewhere (=to a datastore)
            // so that you can find it next time
            String blobKey = fileService.getBlobKey(file).getKeyString();

           }
       }
   }

ブロブの提供:

public class BlobServlet extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String blobParameter = request.getParameter("blob-key");
    if (blobParameter == null) {
        response.sendError(404, "Missing 'blob-key' parameter.");
    }

    BlobKey blobKey = new BlobKey(blobParameter);

    response.setHeader("Cache-Control", "max-age=" + (15 * 60));   // 15 min
    BlobstoreServiceFactory.getBlobstoreService().serve(blobKey, response);
}
}

サーブレットの登録:

<servlet>
    <servlet-name>BlobServlet</servlet-name>
    <servlet-class>com.yourpackage.BlobServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>BlobServlet</servlet-name>
    <url-pattern>/blobservet</url-pattern>
</servlet-mapping> 

JSP で BLOB を参照する:

<a src="/blobserve?<%=blobKey%>">Link to blob</a>
于 2012-08-10T16:57:19.453 に答える