1

我需要使用谷歌雲端點將文件上傳到谷歌雲端存儲並打印回網址到文件。通過谷歌雲端上傳文件端點到谷歌雲端通過Android客戶端存儲

我不想運行一個獨立的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來處理上傳?

回答

3

以防萬一,如果有人想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(); 
     } 
    } 

} 

,只是打這樣的小服務程序:

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