使用Apache Wicket通过Rest进行文件上传

到目前为止的梗概

我在使用Apache Wicket创建的某个项目中遇到了需要通过JavaScript进行文件上传处理的场景。

在 Wicket 中提到 Rest 就是指 wicketstuff-restannotations。
在 Qiita 上也有前辈发布过相关文章,而且只要查看链接提供的文档,大致上就能理解如何使用,但却找不到关于 FileUpload 的示例。

所以,总之,虽然这种方法有点强行,但我决定留下这个备忘录,说我们是用这个方法成功运作了。

版本之类的

    • Wicket 8.1.0

 

    • wicketstuff-restannotations 8.1.0

 

    • Commons FileUpload バンザイ

 

    wicketstuff-restannotationsの使い方とかの説明はナシ

实施或者其他相关操作

喂,我是调用方。有点随便。
虽然现在可能有些过时了,我也不会完全把它当做JQuery,因为你知道,这里是Wicket嘛。

<!DOCTYPE html>
<html>
<body>
<input type="file" id="file-select" style="display:none">
<button id="file-button">ファイル選択</button>
<script>
$('#file-button').click(function(e) {
  $("#file-select").click();
});
$("#file-select").change(function(e) {
  var file = e.target.files;
  if(file.length > 0) {
    var form = new FormData();
    form.append('image', file[0]);
    var settings = {
      "async": false,
      "crossDomain": false,
      "url": "fileUpload",
      "method": "POST",
      "dataType": "text",
      "processData": false,
      "contentType": false,
      "data": form
    }
    $.ajax(settings).done(function (response) {
      if(result.success) {
        alert(response);
      }
    });
  }
});
</script>
</body>
</html>

RestResource是为了获取FileUpload的FileItem而设定的目标。
对于JSON响应之类的东西我觉得通常是要做的,但这方面就省略掉吧。
另外,虽然与此无关,但我不太明白AbstractRestResource为什么是泛型的。

package yamane.rest;

import org.apache.commons.fileupload.FileItem;
import org.wicketstuff.rest.annotations.MethodMapping;
import org.wicketstuff.rest.annotations.parameters.RequestBody;
import org.wicketstuff.rest.contenthandling.mimetypes.RestMimeTypes;
import org.wicketstuff.rest.resource.AbstractRestResource;
import org.wicketstuff.rest.utils.http.HttpMethod;

public class FileUploadResource extends AbstractRestResource<FileUploadSerialDeserial> {

  public FileUploadResource() {
    super(new FileUploadSerialDeserial());
  }

  @MethodMapping(
    value = "/fileUpload",
    httpMethod = HttpMethod.POST,
    produces = RestMimeTypes.TEXT_PLAIN
  )
  public String saveImage(@RequestBody FileItem item) {
    // FileItem さえ取得できれば勝ちだよね!
    return item.getFieldName();
  }
}

“关键的部分是IWebSerialDeserial。
仅仅是获取HttpServletRequest并使用FileUpload进行解析而已。
除了这一部分,其他部分都相当随意。即使是关键代码也还是相对随意。
虽然没什么关系,但是SerialDeserial这个名字怎么样呢?”

package yamane.rest;

import java.io.File;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.wicket.WicketRuntimeException;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.protocol.http.servlet.ServletWebRequest;
import org.apache.wicket.request.http.WebRequest;
import org.apache.wicket.request.http.WebResponse;
import org.wicketstuff.rest.contenthandling.IWebSerialDeserial;

public class FileUploadSerialDeserial implements IWebSerialDeserial {

  DiskFileItemFactory factory = new DiskFileItemFactory();

  FileUploadSerialDeserial() {
    ServletContext context = WebApplication.get().getServletContext();
    File repository = (File) context.getAttribute("javax.servlet.context.tempdir");
    factory.setRepository(repository);
  }

  @Override
  public void objectToResponse(Object str, WebResponse response, String mimeType) throws WicketRuntimeException {
    ServletResponse sResponse = (ServletResponse) response.getContainerResponse();
    sResponse.setCharacterEncoding("UTF-8");
    response.write((CharSequence) str);
  }

  @Override
  @SuppressWarnings("unchecked")
  public <T> T requestToObject(
    WebRequest wRequest,
    Class<T> argClass,
    String mimeType) throws WicketRuntimeException {
    try {
      ServletWebRequest sRequest = (ServletWebRequest) wRequest;
      HttpServletRequest request = sRequest.getContainerRequest();
      ServletFileUpload fileUpload = new ServletFileUpload(factory);
      List<FileItem> items = fileUpload.parseRequest(request);
      return !items.isEmpty() ? (T) items.get(0) : null;
    } catch (FileUploadException e) {
      throw new WicketRuntimeException(e);
    }
  }

  @Override
  public boolean isMimeTypeSupported(String mimeType) {
    return true;
  }
}

这次就到这里吧

所以,通过JavaScript成功获取了文件。
虽然这篇文章比较随意,请原谅。

广告
将在 10 秒后关闭
bannerAds