0

如果文件太大,我会从服务器代码(在 HttpServlet 中)抛出异常:

 public void doPost(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException {
 ...
 // Check if the blob has correct size, otherwise delete it
 final BlobInfo blobInfo = new BlobInfoFactory().loadBlobInfo(blobKey);
 long size = blobInfo.getSize();
 if(size > 0 && size <= BasicConstants.maxImageSize){
    res.sendRedirect("/download?blob-key=" + blobKey.getKeyString());
 } else { // size not allowed
    bs.delete(blobKey);
    throw new RuntimeException(BasicConstants.fileTooLarge);
 }

从我缺少的客户端代码中,我无法使用此代码段成功捕获异常:

try {
    uploadForm.submit(); // send file to BlobStore, where the doPost method is executed
} catch (Exception ex) {
    GWT.log(ex.toString());
}

但是,从这个其他客户端代码片段中,我以某种方式检测到异常何时引发了一个我根本不信任的丑陋解决方法:

uploadForm.addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler() {

    @Override
public void onSubmitComplete(SubmitCompleteEvent event) {
// This is what gets the result back - the content-type *must* be
// text-html
String imageUrl =event.getResults();

    // This ugly workaround apparently manages to detect when the server threw the exception
if (imageUrl.length() == 0) { // file is too large
  uploadFooter.setText(BasicConstants.fileTooLarge);
} else { // file was successfully uploaded
       ...
    }

Eclipse 中的开发模式视图报告了“未捕获的异常”类型的错误,这表明我在检测它方面确实做得不好。

谁能告诉我如何正确捕获异常,以及我使用的解决方法是否有意义?

谢谢!

4

1 回答 1

4

你的第一次尝试

try {
    uploadForm.submit(); // send file to BlobStore, where the doPost method is executed
} catch (Exception ex) {
    GWT.log(ex.toString());
}

不起作用,因为submit()不等到浏览器收到响应(这是一个异步调用)。

uploadForm.addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler() {

  @Override
  public void onSubmitComplete(SubmitCompleteEvent event) {
    ...

在这里,您实际上收到了来自服务器的响应。但它是表单提交,而不是 GWT-RPC 调用,所以结果只是纯文本,而不是 GWT Java 对象。

当您在 Servlet 中抛出 RuntimeException 时,服务器将简单地发送带有错误代码的响应(可能是“500”,但最好使用 Firebug 或 Chrome 开发人员工具中的“网络”选项卡来查看实际的响应和响应代码。)因此,在成功的情况下,您将获得 URL,否则响应为空。

可能的解决方案

您可以在服务器端捕获异常,并明确发送更好的描述:

public void doPost(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException {

  try {

      ...
      if (...) {
        throw new MyTooLargeException();
      } else {
          ...
        res.getWriter().write("ok " + ...);
      }

  } catch (MyTooLargeException e) {
     res.getWriter().write("upload_size_exceeded"); // just an example string 
                                                    // (use your own)

     res.sendError(HttpServletResponse.SC_REQUEST_ENTITY_TOO_LARGE);
  }
}

然后,在客户端,检查

"upload_size_exceeded".equals(event.getResults()).
于 2012-10-19T17:52:10.977 回答