当前位置: 首页 > 知识库问答 >
问题:

如何使用Java App Engine正确上传(图像)文件到Google云存储?

阎懿轩
2023-03-14
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    // read the input stream
    byte[] buffer = new byte[1024];
    List<byte[]> allBytes = new LinkedList<byte[]>();
    InputStream reader = req.getInputStream();
    while(true) {
        int bytesRead = reader.read(buffer);
        if (bytesRead == -1) {
            break; // have a break up with the loop.
        } else if (bytesRead < 1024) {
            byte[] temp = Arrays.copyOf(buffer, bytesRead);
            allBytes.add(temp);
        } else {
            allBytes.add(buffer);
        }
    }

    // init the bucket access
    GcsService gcsService = GcsServiceFactory.createGcsService(RetryParams.getDefaultInstance());
    GcsFilename filename = new GcsFilename("my-bucket", "my-file");
    Builder fileOptionsBuilder = new GcsFileOptions.Builder();
    fileOptionsBuilder.mimeType("text/html"); // or "image/jpeg" for image files
    GcsFileOptions fileOptions = fileOptionsBuilder.build();
    GcsOutputChannel outputChannel = gcsService.createOrReplace(filename, fileOptions);

    // write file out
    BufferedOutputStream outStream = new BufferedOutputStream(Channels.newOutputStream(outputChannel));
    for (byte[] b : allBytes) {
        outStream.write(b);
    }
    outStream.close();
    outputChannel.close();
}
curl --data "someContentToBeRead" http://myAppEngineProj.appspot.com/myServlet
curl -F file=@"picture.jpg" http://myAppEngineProj.appspot.com/myServlet

文件已完全损坏。如果我上传一个文本文件,它在文件的开头有一行废话,在文件的结尾有一行废话,比如:

------------------------------266cb0e18eba
Content-Disposition: form-data; name="file"; filename="blah.txt"
Content-Type: text/plain

hi how are you

------------------------------266cb0e18eba--

我如何告诉云存储我想把数据存储为文件?

共有1个答案

郤浩慨
2023-03-14

这对我很有效

若要上传,请使用

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

servlet看起来像

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.nio.channels.Channels;
import java.util.Enumeration;
import java.util.logging.Logger;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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

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;

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 = "myBucketNameOnGoogleCloudStorage";

    /**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();

                    sctype = item.getContentType();

                    GcsFilename gcsfileName = new GcsFilename(bucketName, sname);

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

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

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

                    res.sendRedirect("/");
                }
            }
        } 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();
        }
      }

}
 类似资料:
  • 问题内容: 我已经阅读了使用Google AppEngine将图像发送到Google云存储中的问题。 但是,答案中的代码表明文件将首先上传到Blobstore,因此文件不能超过32MB。 如何将大文件直接上传到Google Cloud Storage? 我已经检查了官方文档Upload Objects ,但是我仍然不知道如何编写表格来发布大文件。 问题答案: 从1.7.0开始 将直接上传到Goog

  • 我想上传文件从谷歌应用程序引擎到谷歌云存储我使用Pyhton 3.8和烧瓶。 app.yaml: 要求。文本 我试图上传文件使用Flask(https://www.tutorialspoint.com/flask/flask_file_uploading.htm) /tmp(在App Engine临时存储(https://cloud.google.com/appengine/docs/standa

  • 问题内容: 我目前正在使用一个php应用程序将图像上传到Google云存储平台,但是,与在我的本地服务器上不同,我在确定如何使这项工作方面遇到了很大的麻烦。 这正是我想做的事情: 将图像的路径写入我的Google Cloud SQL 实际将图像上传到Google云存储平台 从保存的SQL路径编写一个调用图像的脚本,然后发布到我的网站 谁能指出正确的方向? 谢谢! 问题答案: 像这样的事情对我来说适

  • 我从一个网址读取图像并处理它。我需要将这些数据上传到云存储中的一个文件中,目前我正在将这些数据写入一个文件,并上传该文件,然后删除该文件。有没有办法把数据直接上传到云端仓库?

  • 我正在尝试使用谷歌云存储JSON API将图像上传到谷歌云存储桶中。文件正在上载,但没有显示任何内容。 我正在通过以下方式上载图像:- 图像1 看图片1,文件上传成功。但当我点击它查看它时,它显示如图2所示。 图像2

  • 我已经阅读了与此相关的所有其他答案。但这对我不起作用,或者我只是不明白一些事情。请帮忙。 我正在从客户端发送'image/png'base64字符串。它是这样的:“Ivborw0kggoaaansuheugaaaaaaaaaaa……” 在云函数我有方法: 有什么不对劲?