【问题标题】:Upload a file via google cloud Endpoints to google cloud Storage via Android Client通过 google cloud Endpoints 将文件通过 Android Client 上传到 google cloud Storage
【发布时间】:2015-08-28 22:49:41
【问题描述】:

我需要使用谷歌云端点将文件上传到谷歌云存储并打印回文件的网址。

我不想运行一个独立的 servlet 来处理文件上传。

服务器代码如下:

import java.io.File;

public void saveFile(File upload,User auth) throws IOException {
            if (auth!=null){
                String bucketName = "app-id.appspot.com";

            GcsService gcsService = GcsServiceFactory.createGcsService(new RetryParams.Builder()
                    .initialRetryDelayMillis(10)
                    .retryMaxAttempts(10)
                    .totalRetryPeriodMillis(15000)
                    .build());

            String sname = upload.getName();
            String extension = sname.substring(sname.lastIndexOf('.'),sname.length());

            String sctype =  URLConnection.guessContentTypeFromName(upload.getName());

            String filename;
            filename = String.valueOf(Calendar.getInstance().getTimeInMillis()) + extension;

            GcsFilename gcsfileName = new GcsFilename(bucketName, filename);

            GcsFileOptions options = new GcsFileOptions.Builder()
                    .acl("public-read").mimeType(sctype).build();

            GcsOutputChannel outputChannel =
                    gcsService.createOrReplace(gcsfileName, options);

            InputStream stream = new FileInputStream(upload);

            copy(stream, Channels.newOutputStream(outputChannel));
        }
    }

    private static final int BUFFER_SIZE = 2 * 1024 * 1024;

    private void copy(InputStream input, OutputStream output) throws IOException {
        try {
            byte[] buffer = new byte[BUFFER_SIZE];
            int bytesRead = input.read(buffer);
            while (bytesRead != -1) {
                output.write(buffer, 0, bytesRead);
                bytesRead = input.read(buffer);
            }
        } finally {
            input.close();
            output.close();
        }
    }

但是当我重建项目时,导入的java.io.File 会在生成的客户端库中转换为com.backend.managerApi.model.File。

那么,有没有办法做到这一点,或者我们只需要运行一个独立的 servlet 来处理上传?

【问题讨论】:

    标签: java android google-app-engine google-cloud-storage google-cloud-endpoints


    【解决方案1】:

    以防万一有人希望 Servlet 代码做同样的事情:

    import com.google.appengine.tools.cloudstorage.GcsFileOptions;
    import com.google.appengine.tools.cloudstorage.GcsFilename;
    import com.google.appengine.tools.cloudstorage.GcsOutputChannel;
    import com.google.appengine.tools.cloudstorage.GcsService;
    import com.google.appengine.tools.cloudstorage.GcsServiceFactory;
    import com.google.appengine.tools.cloudstorage.RetryParams;
    
    import org.apache.commons.fileupload.FileItemIterator;
    import org.apache.commons.fileupload.FileItemStream;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.nio.channels.Channels;
    import java.util.Calendar;
    import java.util.logging.Logger;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class UploadServlet extends HttpServlet {
    
        private static final Logger log = Logger.getLogger(UploadServlet.class.getName());
    
        private final GcsService gcsService = GcsServiceFactory.createGcsService(new RetryParams.Builder()
                .initialRetryDelayMillis(10)
                .retryMaxAttempts(10)
                .totalRetryPeriodMillis(15000)
                .build());
    
        private String bucketName = "app-id.appspot.com";
    
        /**Used below to determine the size of chucks to read in. Should be > 1kb and < 10MB */
        private static final int BUFFER_SIZE = 2 * 1024 * 1024;
    
        @SuppressWarnings("unchecked")
        @Override
        public void doPost(HttpServletRequest req, HttpServletResponse res)
                throws ServletException, IOException {
    
            String sctype = null, sfieldname, sname = null;
            ServletFileUpload upload;
            FileItemIterator iterator;
            FileItemStream item;
            InputStream stream = null;
            try {
                upload = new ServletFileUpload();
                res.setContentType("text/plain");
    
                iterator = upload.getItemIterator(req);
                while (iterator.hasNext()) {
                    item = iterator.next();
                    stream = item.openStream();
    
                    if (item.isFormField()) {
                        log.warning("Got a form field: " + item.getFieldName());
                    } else {
                        log.warning("Got an uploaded file: " + item.getFieldName() +
                                ", name = " + item.getName());
    
                        //sfieldname = item.getFieldName();
    
                        sname = item.getName();
                        String extension = sname.substring(sname.lastIndexOf('.'),sname.length());
    
                        sctype = item.getContentType();
    
                        String filename;
                        filename = String.valueOf(Calendar.getInstance().getTimeInMillis()) + extension;
    
                        GcsFilename gcsfileName = new GcsFilename(bucketName, filename);
    
                        GcsFileOptions options = new GcsFileOptions.Builder()
                                .acl("public-read").mimeType(sctype).build();
    
                        GcsOutputChannel outputChannel =
                                gcsService.createOrReplace(gcsfileName, options);
    
                        copy(stream, Channels.newOutputStream(outputChannel));
    
                        //res.sendRedirect("/");
                        res.getWriter().print(filename);
                    }
                }
            } catch (Exception ex) {
                throw new ServletException(ex);
            }
        }
    
        private void copy(InputStream input, OutputStream output) throws IOException {
            try {
                byte[] buffer = new byte[BUFFER_SIZE];
                int bytesRead = input.read(buffer);
                while (bytesRead != -1) {
                    output.write(buffer, 0, bytesRead);
                    bytesRead = input.read(buffer);
                }
            } finally {
                input.close();
                output.close();
            }
        }
    
    }
    

    然后像这样点击 servlet:

    curl -F file=@"picture.jpg" http://myAppEngineProj.appspot.com/myServlet

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-02
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 2016-05-06
      • 1970-01-01
      • 2021-06-19
      • 1970-01-01
      相关资源
      最近更新 更多