[JAVA] FileUpload mit Rest auf Apache Wicket

Bisherige Zusammenfassung

Ich bin auf eine Situation gestoßen, in der ich die FileUpload-Verarbeitung über JavaScript in Nanika implementieren wollte, die mit Apache Wicket erstellt wurde.

Rest in Wicket ist wicketstuff-restannotations. Es gibt einen Vorgänger, der auch einen Artikel über Qiita veröffentlicht hat, und wenn Sie sich das verknüpfte Dokument ansehen, können Sie ungefähr verstehen, wie es verwendet wird, aber ein Beispiel von FileUpload Wurde nicht gefunden.

Deshalb habe ich beschlossen, eine Notiz zu hinterlassen, dass es vorerst eine Krafttechnik zu sein scheint, aber es hat damit funktioniert.

Ausführung

Implementierung

Anrufer. Komm schon. Ich glaube nicht mehr, dass es JQuery ist, aber es ist Wicket.

test.html


<!DOCTYPE html>
<html>
<body>
<input type="file" id="file-select" style="display:none">
<button id="file-button">Dateiauswahl</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。 Ist es das unmittelbare Ziel, das FileItem von FileUpload hier abzurufen? Ich denke, dass die Antwort in JSON normal ist, aber ich lasse diesen Teil weg. Es spielt keine Rolle, aber ich bin mir nicht sicher, warum Abstract Rest Resource ein generischer Typ ist.

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) {
    //Wenn Sie FileItem erhalten können, gewinnen Sie!
    return item.getFieldName();
  }
}

Der Teil der Leber, IWebSerialDeserial. Nun, ich hole einfach HttpServletRequest und analysiere es mit FileUpload. Es ist bis auf die entsprechende Verarbeitung durchaus angebracht. Eine entsprechende Verarbeitung ist ebenfalls angemessen. Es spielt keine Rolle, aber was ist mit dem Namen 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;
  }
}

Bis hierher für diese Zeit

So konnte ich die Datei sicher über JavaScript abrufen. Es ist ein grober Artikel, aber bitte verzeihen Sie mir, dass ich mir eine Notiz gemacht habe.

Recommended Posts

FileUpload mit Rest auf Apache Wicket
Ungültige Lambda-Deserialisierung in Lambda auf Apache Wicket 8
Erstellen Sie eine REST-API mit Apache2 + Passenger + Sinatra.
Verwenden Sie Vorlagen für den Klassenpfad mit Apache Velocity
Hallo Welt (REST API) mit Apache Camel + Spring Boot 2
Apache2 unter Ubuntu20.04 LTS
Wiederholte Probe mit Apache Freemarker
Erstellen Sie eine XML-RPC-API mit Wicket
Starten Sie Apache Solr mit Embedded.
Vermeiden Sie die Serialisierung von Seiten mit Wicket
Greifen Sie mit Micronaut auf Apache Kafka zu
Installieren Sie Apache unter CentOS auf VirtualBox
Ich habe versucht, Apache Wicket zu verwenden
REST-API-Test mit REST Assured
Bearbeiten Sie Excel mit Apache POI