Je suis tombé sur une situation où je voulais implémenter le traitement FileUpload via JavaScript dans Nanika réalisé avec Apache Wicket.
Rest in Wicket est wicketstuff-restannotations. Il existe un prédécesseur qui a également publié un article sur Qiita, et si vous regardez le document lié, vous pouvez en gros comprendre comment l'utiliser, mais un exemple de FileUpload N'est pas trouvé.
C'est pourquoi j'ai décidé de laisser une note indiquant que cela semble être une technique de puissance pour le moment, mais cela a fonctionné avec cela.
Votre interlocuteur. Allons. Je ne pense plus que ce soit JQuery, mais c'est Wicket.
test.html
<!DOCTYPE html>
<html>
<body>
<input type="file" id="file-select" style="display:none">
<button id="file-button">Sélection de fichiers</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。 Est-ce l'objectif immédiat d'obtenir le FileItem de FileUpload ici? Je pense que la réponse en JSON est normale, mais j'omets cette partie. Cela n'a pas d'importance, mais je ne sais pas pourquoi Abstract Rest Resource est un type générique.
FileUploadResource.java
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) {
//Si vous pouvez obtenir le FileItem, vous gagnez!
return item.getFieldName();
}
}
La partie du foie, IWebSerialDeserial. Eh bien, je viens de récupérer HttpServletRequest et de l'analyser avec FileUpload. Il est tout à fait approprié sauf pour le traitement correspondant. Un traitement correspondant est également raisonnablement approprié. Cela n'a pas d'importance, mais qu'en est-il du nom SerialDeserial?
FileUploadSerialDeserial.java
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;
}
}
Donc, j'ai pu obtenir le fichier via JavaScript en toute sécurité. C'est un article approximatif, mais pardonnez-moi de prendre des notes.
Recommended Posts