Wicket和AJAX:将文件上传到服务器并在页面上显示

时间:2013-04-29 00:16:34

标签: javascript ajax wicket

我的网络应用程序在tomcat6上运行,我正在使用 Wicket 进行开发。 我要做的是将图像文件上传到服务器,并在上传后立即显示在网页上。我按照here描述通过AJAX上传文件。文件上传后会存储在/home/mysuser/路径的磁盘上。上传文件时,我正在执行JavaScript,以便将该文件加载到HTML对象中:

Wicket代码:

protected void onSubmit(AjaxRequestTarget target, Form<?> form)
{
    target.appendJavaScript("loadOriginalImage(\""+
              (UPLOAD_FOLDER + TMP_FILE_NAME1)+"\")");
}

JavaScript代码:

function loadOriginalImage(image_path){
   var curImg = new Image();
   curImg.src = "file://"+image_path;
   curImg.onload = function(){
      imgHolder.appendChild(this);   
   }
}

文件上传得很好,但是当执行JavaScript时,会出现下一个错误:

Not allowed to load local resource

然后我尝试从JavaScript代码中删除"file://",因为我发现该文件是从客户端的本地文件夹中读取的,而不是从服务器中读取的。但是这次我有下一个错误:

GET http://localhost:8080/home/myuser/originalImg.jpg 404 (Not Found) 

所以我有两个问题:

1。我如何在JavaScript中指定上传文件的正确路径?

2。将图片上传到服务器后,将图片加载到网页是否正确?

2 个答案:

答案 0 :(得分:2)

您的方法需要考虑以下几点:

  • 转义文件名
  • 网络服务器(本例中为tomcat / wicket)很可能无法从某个任意目录中提供文件

您应该实现一个资源,将图像流回来并按照Alexey的指示安装此资源。

确保您只提供图像文件,请确保禁用目录遍历,否则有人会弄清楚如何从文件系统中读取任何文件。

答案 1 :(得分:1)

您应该将资源安装到"home/myuser/${name}",阅读this以获取详细信息。

您可以使用以下代码调整缓存(示例中没有缓存):

@Override
protected void setResponseHeaders(ResourceResponse data, Attributes attributes) {
    data.setCacheDuration(Duration.NONE);
    super.setResponseHeaders(data, attributes);
}

要允许某些扩展程序,请检查以下资源: