1

Мне нужно загрузить файл с помощью конечных точек Google для облачных хранилищ Google и распечатать URL-адрес файла.Загрузить файл через Google Cloud Конечные точки в облаке Google Хранение через Android Client

Я не хочу запускать независимый сервлет, обрабатывающий загрузку файлов.

код сервера выглядит следующим образом:

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 в созданных клиентских библиотек.

Итак, есть ли способ сделать это, или нам просто нужно запустить независимый сервлет для обработки загрузок?

ответ

3

Только в случае, если кто-то хочет код сервлета, чтобы сделать то же самое:

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

} 

И Просто нажмите сервлет так:

curl -F [email protected]"picture.jpg" http://myAppEngineProj.appspot.com/myServlet

Смежные вопросы