【问题标题】:uploading a file using apache streaming API and Google App Engine Virtual File System使用 apache 流 API 和 Google App Engine 虚拟文件系统上传文件
【发布时间】:2012-08-10 14:05:46
【问题描述】:

要将文件上传到我在 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 的目录。

【问题讨论】:

    标签: java google-app-engine jakarta-ee apache-commons


    【解决方案1】:

    GAE 文件系统是只读的。通过 API 有 no write access。更改文件系统内容的唯一方法是通过appcfg 更新应用程序。

    如果您需要上传和存储数据,请使用BlobstoreGoogle Cloud Storage

    上传到 blobstore:

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

    提供 blob:

    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>
        <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>
    

    【讨论】:

    • 那么 GAEVFS 意味着什么?
    • 必须有一种使用 apache commons 和 GAEVFS 上传数据的方法
    • 据我所知 GAEVFS 使用 memcache (volatile) 和 datastore (max 1MB blob)
    • 顺便说一句,这里是一个上传 servlet 示例:code.google.com/p/gaevfs/source/browse/trunk/src/com/newatlanta/…
    • 感谢您的示例。那里的代码使用apache commons streaming API上传文件。有上传限制吗?我不这么认为。我想将文件上传到我的项目中名为 uploads 的目录。如何指定目录?
    猜你喜欢
    • 1970-01-01
    • 2013-12-16
    • 2011-12-24
    • 1970-01-01
    • 2010-11-01
    • 2010-10-24
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多