我正在开发在 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的整体结构推断出这一点。
相关代码片段:
上传 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
的源代码,我不知道如何继续调试。
问题:
任何帮助或指导将不胜感激。谢谢!
这会抛出:
UploadBlobServlet
这不会:
String uploadUrl = fileUploader.getUploadUrl("callback");