首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一次上传多个安卓文件到AppEngine

一次上传多个安卓文件到AppEngine
EN

Stack Overflow用户
提问于 2012-06-08 15:30:14
回答 1查看 1.1K关注 0票数 4

我知道我可以使用multipart/form POST请求一次上传一个文件到AppEngine。AppEngine也支持uploading multiple files,但是你必须做一些空洞的东西才能让它工作。

我有一个应用程序,需要我上传一些表格数据,2个图像和3个领域的文本。这可以通过AppEngine实现吗?我一直在努力寻找关于这方面的信息,但这很难,因为我需要这样的灵活性。我将把数据存储在blob存储/数据存储中。

我需要一个Java解决方案。

这是我的POST方法的签名:

代码语言:javascript
复制
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void post(
       @Context HttpServletRequest request,
       @Context HttpServletResponse response)
       throws FileUploadException, IOException {}

如果确实需要,可以复制并粘贴Java Servlet。上面是问题和相关的servlet片段。

代码语言:javascript
复制
import java.io.BufferedReader;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.util.Iterator;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;

import org.apache.commons.fileupload.FileItemHeaders;
import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileItemStream;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import com.google.appengine.api.blobstore.BlobstoreService;
import com.google.appengine.api.blobstore.BlobstoreServiceFactory;
import com.google.appengine.api.files.AppEngineFile;
import com.google.appengine.api.files.FileReadChannel;
import com.google.appengine.api.files.FileService;
import com.google.appengine.api.files.FileServiceFactory;
import com.google.appengine.api.files.FileWriteChannel;

@Path("/upload")
public class FileUploadServlet {

    private BlobstoreService blobstoreService = BlobstoreServiceFactory
            .getBlobstoreService();

    @POST
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public void post(@Context HttpServletRequest request,
            @Context HttpServletResponse response) throws FileUploadException,
            IOException {

        final ServletFileUpload upload = new ServletFileUpload();
        final FileItemIterator fileIter = upload.getItemIterator(request);

        while (fileIter.hasNext()) {
            final FileItemStream item = fileIter.next();
            String name = item.getName();
            String fieldName = item.getFieldName();
            String contentType = item.getContentType();
            Log.d("Name  =  " + name);
            Log.d("Field-Name  =  " + fieldName);
            Log.d("Content-Type  =  " + contentType);
            FileItemHeaders headers = item.getHeaders();
            if(headers != null) {
                Iterator<String> it = (Iterator<String>)headers.getHeaderNames();
                while(it.hasNext()) {
                    String h = it.next();
                    Log.d(h + "  =  " + headers.getHeader(h));
                }
            }
            if (item.isFormField()) {
                // Nothing
            } else {
                RawImageData data = new RawImageData();
                data.load(item.openStream());
                            // RawImageData reads the stream and stores it into a large byte[] called data.imageData
                ByteBuffer bb = ByteBuffer.wrap(data.imageData);
                FileService fs = FileServiceFactory.getFileService();
                AppEngineFile file = fs.createNewBlobFile(contentType);
                FileWriteChannel write = fs.openWriteChannel(file, true);

                write.write(bb);
                write.closeFinally();
                String path = file.getFullPath();
                Log.d(path);

                // Later, read from the file using the file API
                boolean lock = false; // Let other people read at the same time
                FileReadChannel readChannel = fs.openReadChannel(file,
                        false);
                            // CRASHES WITH java.nio.charset.IllegalCharsetNameException: image/jpeg
                            // contentType = "image/jpeg"
                // Again, different standard Java ways of reading from the
                // channel.
                BufferedReader reader = new BufferedReader(Channels.newReader(readChannel, contentType));

                readChannel.close();
            }
        }

        response.setContentType("text/html");
        response.getOutputStream().write("success".getBytes());
    }
}

完全例外:

代码语言:javascript
复制
WARNING: /api/upload
java.nio.charset.IllegalCharsetNameException: image/jpeg
    at java.nio.charset.Charset.checkName(Charset.java:284)
    at java.nio.charset.Charset.lookup2(Charset.java:458)
    at java.nio.charset.Charset.lookup(Charset.java:437)
    at java.nio.charset.Charset.forName(Charset.java:502)
    at java.nio.channels.Channels.newReader(Channels.java:381)
    at com.futonredemption.starstarstar.FileUploadServlet.post(FileUploadServlet.java:96)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    blah blah blah
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-09 01:44:38

您可以创建自己的multipart file upload handler,然后通过Blobstore FileService API保存文件。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10944718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档