1

apache commons を使用してプロジェクト フォルダーの画像にファイルをアップロードしようとすると、次の例外が生成されました。

これらのログを google appengine のログ ビューアからコピーしています。

2012-08-04 17:52:38.238 /UploadImagesToAisle 500 4381ms 0kb Mozilla/5.0 (X11; 
Linux i686; rv:13.0) Gecko/20100101 Firefox/13.0

106.200.242.109 - - [04/Aug/2012:05:22:38 -0700] "POST /UploadImagesToAisle 
HTTP/1.1" 500 0 "http://programworks.appspot.com/ValidateCredentials" 
"Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20100101 Firefox/13.0" 
"programworks.appspot.com" ms=4382 cpu_ms=1773 api_cpu_ms=0 cpm_usd=0.066922 
loading_request=1 instance=00c61b117ce6b4d0249c878697d13e1a0a649c

W 2012-08-04 17:52:38.178

Error for /UploadImagesToAisle
java.lang.NoClassDefFoundError: java.rmi.server.UID is a restricted class. Please see the Google App Engine developer's guide for more details.
at com.google.apphosting.runtime.security.shared.stub.java.rmi.server.UID.<clinit>(UID.java)
at org.apache.commons.fileupload.disk.DiskFileItem.<clinit>(DiskFileItem.java:109)
at org.apache.commons.fileupload.disk.DiskFileItemFactory.createItem(DiskFileItemFactory.java:199)
at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:361)
at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126)
at Servlets.UploadImagesToAisle.doPost(UploadImagesToAisle.java:49)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)

........

Google appengine をサーバーとして使用しているときにファイルをアップロードしようとしており、アップロードされたファイルをプロジェクト ディレクトリにコピーしています。つまり、web-pages の下のディレクトリ内。

ファイルのアップロードに使用したサーブレットは次のとおりです。

   @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    String path = request.getParameter("Data");
    PrintWriter writer = response.getWriter();
     try {
       boolean isMultipart = ServletFileUpload.isMultipartContent(request);
       if( !isMultipart ) {
           writer.println("File cannot be uploaded !");
       } else {
           DiskFileItemFactory diskFileItem = new DiskFileItemFactory();
           ServletFileUpload fileUpload = new ServletFileUpload(diskFileItem);
           List list = null;

           try {
               list = fileUpload.parseRequest(request);
           }catch(Exception exc) {
               writer.println(exc);
           }

           Iterator iterator = list.iterator();
           while(iterator.hasNext()) {
              FileItem fileItem = (FileItem)iterator.next();
              if(fileItem.isFormField()) {
                  // Process regular form field (input type="text|radio|checkbox|etc", select, etc).
              } else {
                  // Process form file field (input type="file").
                  String fieldName = fileItem.getFieldName();
                  String fileName = FilenameUtils.getName(fileItem.getName());
                  File file = new File("images/",fileName);
                  fileItem.write(file);
              }
           }
       }
    }catch(Exception exc) {
        writer.println(exc);
    }
}

HTML スニペット

            <form method="post" enctype="multipart/form-data" action="../../UploadImagesToAisle">
            <input type="file" name="Data"/>
            <input type="submit" value="upload"/>
        </form>

ファイルをアップロードするプロジェクト内のimagesディレクトリ:

ここに画像の説明を入力

4

1 に答える 1

2

GoogleAppEngineでファイルシステムに書き込むことはできません。すべてのアプリケーションはサンドボックス化されています。プロジェクトとともにアップロードされたファイルのみを読み取ることができ、ファイルシステムに書き込むことはできません。これが、このエラーが発生する理由です。

これを克服するために、GoogleAppEngine仮想ファイルシステムを利用できます。そのライブラリは、GAEデータストアとmemcacheAPIを使用して実装されています。これは役立つかもしれません。

編集:http://code.google.com/p/gaevfs/downloads/detail?name = gaevfs-0.3.zip&can = 2&q=
でダウンロードしたライブラリファイルをウェブサーバーに追加します。 これを試してコメントを投稿してください:

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    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 fileUpload = new ServletFileUpload();
           List list = null;

           try {
               list = fileUpload.parseRequest(request);
           }catch(Exception exc) {
               writer.println(exc);
           }

           Iterator iterator = list.iterator();
           while(iterator.hasNext()) {
              FileItem fileItem = (FileItem)iterator.next();
              if(fileItem.isFormField()) {
                  // Process regular form field (input type="text|radio|checkbox|etc", select, etc).
              } else {
                  // Process form file field (input type="file").
                  String fieldName = fileItem.getFieldName();
                  String fileName = FilenameUtils.getName(fileItem.getName());
                  GaeVFS.setRootPath( getServletContext.getRealPath( "/" ) );
                  FileSystemManager fsManager = GaeVFS.getManager();
                    FileObject file = fsManager.resolveFile( "gae://images/"+filename );
                  fileItem.write(file);
              }
           }
       }
    }catch(Exception exc) {
        writer.println(exc);
    }
}

インポート時にこれを追加します。

import org.apache.commons.vfs.FileSystemManager;
import org.apache.commons.vfs.FileObject;
import com.newatlanta.commons.vfs.provider.gae.GaeVFS;
于 2012-08-04T15:49:05.227 に答える