[JAVA] FileUpload avec Rest sur Apache Wicket

Synopsis jusqu'à présent

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.

Version

la mise en oeuvre

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;
  }
}

Jusqu'à ici pour cette fois

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

FileUpload avec Rest sur Apache Wicket
Désérialisation lambda non valide dans Lambda sur Apache Wicket 8
Créez une API REST avec Apache2 + Passenger + Sinatra.
Utilisez des modèles sur le chemin de classe avec Apache Velocity
Hello World (API REST) avec Apache Camel + Spring Boot 2
Apache2 sur Ubuntu20.04 LTS
Échantillon répété avec Apache Freemarker
Créer une API XML-RPC avec Wicket
Démarrez Apache Solr avec Embedded.
Évitez la sérialisation des pages avec Wicket
Sortie CSV par Apache Commons CSV
Accédez à Apache Kafka avec Micronaut
Installez Apache sur CentOS sur VirtualBox
J'ai essayé d'utiliser Apache Wicket
Test de l'API REST avec REST Assured
Manipuler Excel avec Apache POI