使用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成功获取了文件。
虽然这篇文章比较随意,请原谅。