在没有浏览器的情况下将文件上传到 Google App Engine Blobstore 的正确方法是什么? [已关闭]

问题描述 投票:0回答:1

我正在开发在 Google App Engine (GAE) 上运行的 Java Web 应用程序中的文件上传功能。该应用程序使用 Blobstore API 来处理文件上传。但是,在尝试上传文件时,我遇到了

NullPointerException
(NPE),由于“appengine-api-stubs”版本中缺少
com.google.appengine.api.blobstore.dev.UploadBlobServlet
类的源代码,我无法调试该问题1.9.88.

错误信息:

java.lang.NullPointerException
    at com.google.appengine.api.blobstore.dev.UploadBlobServlet.handleUpload(UploadBlobServlet.java:432)

NPE指向

UploadBlobServlet
中的第432行,因为我无法访问确切的源代码,所以我根据servlet的整体结构推断出这一点。

相关代码片段:

此行 432 来自 https://github.com/GoogleCloudPlatform/appengine-java-standard/blob/8380dd6b475a49b45112e6c4a20acbb922c28c5e/api_dev/src/main/java/com/google/appengine/api/blobstore/dev/UploadBlobServlet.java# L432 建议使用此代码块:

上传 Servlet 方法片段:

public final class UploadBlobServlet extends HttpServlet {
    @Override
    public Enumeration<String> getParameterNames() {
        List<String> allNames = new ArrayList<>();
        Enumeration<String> names = super.getParameterNames();
        while (names.hasMoreElements()) {
            allNames.add(names.nextElement());
        }
        // Additional code for handling other parameters
        return Collections.enumeration(allNames);
    }
}

虽然这看起来违反直觉,因为抛出的方法应该是

handleUpload

文件上传客户端代码:

public class FileUploader {
    public String getUploadUrl(String callbackPath) throws URISyntaxException, IOException {
        // Setup Remote API
        BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
        String uploadUrl = blobstoreService.createUploadUrl(callbackPath);
        return uploadUrl;
    }

    public String uploadFile(String url, String partName, String filename, String mimeType, byte[] contents) throws IOException {
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            HttpPost post = new HttpPost(url);
            MultipartEntityBuilder builder = MultipartEntityBuilder.create();
            ByteArrayBody contentBody = new ByteArrayBody(contents, ContentType.create(mimeType), filename);
            builder.addPart(partName, contentBody);
            post.setEntity(builder.build());
            HttpResponse response = httpClient.execute(post);
            return EntityUtils.toString(response.getEntity());
        }
    }
}

测试方法:

@Test
public void shouldBeAbleToUpload) throws Exception {
    FileUploader fileUploader = new FileUploader();
    String uploadUrl = fileUploader.getUploadUrl("path/to/some/blob");
    InputStream sample = getClass().getResourceAsStream("/100mb.bin");
    byte[] fileContent = readFileToByteArray(sample);
    fileUploader.uploadFile(uploadUrl, "file", "sample.html", "application/octet-stream", fileContent);
}

主要问题: 主要问题是文件上传过程中的NPE。我怀疑该问题可能与参数的处理方式有关,或者可能与我的上传逻辑中的设置不正确有关。但是,由于无法访问

UploadBlobServlet
的源代码,我不知道如何继续调试。

问题:

  1. 是否有人在将文件上传到 GAE Blobstore 时遇到类似问题,并且可以提供有关可能出现问题的见解?
  2. 处理多部分表单数据时是否存在可能导致 NPE 的已知问题?
    关于如何调试或解决此问题有什么建议,特别是考虑到 servlet 缺乏源代码?
  3. 我已确认生成的上传URL正确且可访问,并且应用程序正在GAE提供的本地开发服务器上运行。

任何帮助或指导将不胜感激。谢谢!

java google-app-engine blobstore
1个回答
0
投票

这会抛出:

UploadBlobServlet

这不会:

String uploadUrl = fileUploader.getUploadUrl("callback");

© www.soinside.com 2019 - 2024. All rights reserved.