我試圖通過JSP文件上傳和驗證servlet將圖像上傳到Blobstore。 JSP的部分如下:Google app引擎:通過java servlet將圖像存儲在Blobstore中時的NullpointerException
<form action="/testuploadmimevalidation?provider-key=testprovider" method="post" enctype="multipart/form-data">
<input type="text" name="foo">
<input type="file" name="myfile" >
<input type="submit" value="Submit">
</form>
Java類TestUploadMimeValidation
如下:
public class TestUploadMimeValidation extends HttpServlet {
private BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
private static final Logger log = Logger.getLogger(TestUploadMimeValidation.class.getName());
private static final boolean PRODUCTION_MODE = SystemProperty.environment.value() == SystemProperty.Environment.Value.Production;
private static final String URL_PREFIX = PRODUCTION_MODE ? "" : "http://127.0.0.1:8080";
public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
InputStream in = req.getInputStream();
int formDataLength = req.getContentLength();
byte dataBytes[] = new byte[formDataLength];
int len;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while ((len = in.read(dataBytes, 0, formDataLength)) != -1)
bos.write(dataBytes, 0, len);
dataBytes = bos.toByteArray();
String urlStr = URL_PREFIX + BlobstoreServiceFactory.getBlobstoreService().createUploadUrl("/testupload");
URLFetchService urlFetch = URLFetchServiceFactory.getURLFetchService();
HTTPRequest request = new HTTPRequest(new URL(urlStr), HTTPMethod.POST, FetchOptions.Builder.withDeadline(20.0));
request.setHeader(new HTTPHeader("Content-Type", "multipart/form-data"));
request.setPayload(dataBytes);
System.out.println("step1");
try {
HTTPResponse response = urlFetch.fetch(request);
System.out.println("step2");
} catch (IOException e) {
} catch (NullPointerException e) {
}
System.out.println("step3");
}
}
該類上傳圖像到Blob存儲區就好了,但我得到一個NullPointerException
。堆棧跟蹤如下:
WARNING: /_ah/upload/ag5tOGJ5dXMtZGV2ZWxvcHIbCxIVX19CbG9iVXBsb2FkU2Vzc2lvbl9fGAIM
java.lang.NullPointerException
at javax.mail.internet.MimeMultipart.writeTo(MimeMultipart.java:143)
at com.google.appengine.api.blobstore.dev.UploadBlobServlet.handleUpload(UploadBlobServlet.java:180)
at com.google.appengine.api.blobstore.dev.UploadBlobServlet.access$000(UploadBlobServlet.java:72)
at com.google.appengine.api.blobstore.dev.UploadBlobServlet$1.run(UploadBlobServlet.java:101)
at java.security.AccessController.doPrivileged(Native Method)
at com.google.appengine.api.blobstore.dev.UploadBlobServlet.doPost(UploadBlobServlet.java:98)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:58)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:351)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
由於這個NPE,我的代碼在TestUpload.java
類沒有得到執行。 println
出來罰款。它打印「step3」。圖像被存儲到數據存儲區中。但我不能讓TestUpload
中的代碼運行。你有什麼想法可能會導致異常?我試圖搗亂多部分,但不是很成功。
任何有關這個問題的幫助將非常感激。
是您上傳後發送電子郵件?爲什麼錯誤來自avax.mail – Kal 2011-05-17 17:47:16
您的JSP不可能工作,它必須調用blobstoreservice.createUploadURL()作爲其操作的一部分。 – 2011-05-17 21:11:05
@ Jarrod。 blobstoreservice。createUploadURL()在TestUploadMimeValidation servlet中被調用。當這個servlet完成時,我的Blob文件被存儲在blobstore中,但是我得到了這個空指針異常。它也不會轉發到testupload servlet(在TestUploadMimeValidation servlet的createUploadUrl()。第14行中指出的那個) – dant3InTrouble 2011-05-19 12:42:00