2014-07-22 4 views
6

Ich bin neu in REST API. Ich möchte die vom Benutzer ausgewählte Datei mithilfe der REST-API in den vom Benutzer angegebenen Pfad hochladen (Remote- oder lokaler Pfad). Meine HTML-Datei hat 1 Textfeld und 1 Dateiauswahl. Der Benutzer gibt FilePath (Speicherort des lokalen oder Remote-Computerordners) in das Textfeld ein. Bitte schlagen Sie vor, wie Sie dieses Problem lösen können.Datei-Upload mit Rest API in Java

Hier ist mein Code:

FileUpload.html::

<body> 
    <form action="rest/file/upload" method="post" enctype="multipart/form-data"> 
     <p> 
      Select a file : <input type="file" name="file" size="45" /> 
     </p> 
     <p>Target Upload Path : <input type="text" name="path" /></p> 
     <input type="submit" value="Upload It" /> 
    </form> 
</body> 

UploadFileService.java

@Path("/file") 
public class UploadFileService { 

    @POST 
    @Path("/upload") 
    @Consumes(MediaType.MULTIPART_FORM_DATA) 
    public Response uploadFile(
      @FormDataParam("file") InputStream uploadedInputStream, 
      @FormDataParam("file") FormDataContentDisposition fileDetail, 
      @FormParam("path") String path) { 

     /*String uploadedFileLocation = "d://uploaded/"                 + fileDetail.getFileName();*/ 

     /*String uploadedFileLocation = //10.217.14.88/Installables/uploaded/"                 + fileDetail.getFileName();*/ 
     String uploadedFileLocation = path 
       + fileDetail.getFileName(); 

     // save it 
     writeToFile(uploadedInputStream, uploadedFileLocation); 

     String output = "File uploaded to : " + uploadedFileLocation; 

     return Response.status(200).entity(output).build(); 

    } 

    // save uploaded file to new location 
    private void writeToFile(InputStream uploadedInputStream, 
      String uploadedFileLocation) { 

     try { 
      OutputStream out = new FileOutputStream(new File(
        uploadedFileLocation)); 
      int read = 0; 
      byte[] bytes = new byte[1024]; 

      out = new FileOutputStream(new File(uploadedFileLocation)); 
      while ((read = uploadedInputStream.read(bytes)) != -1) { 
       out.write(bytes, 0, read); 
      } 
      out.flush(); 
      out.close(); 
     } catch (IOException e) { 

      e.printStackTrace(); 
     } 

    } 

} 

Web.xml

Ausnahme:

HTTP Status 500 - com.sun.jersey.api.container.ContainerException: Exception obtaining parameters 
type Exception report 
message com.sun.jersey.api.container.ContainerException: Exception obtaining parameters 
description The server encountered an internal error that prevented it from fulfilling this request. 
exception 
javax.servlet.ServletException: com.sun.jersey.api.container.ContainerException: Exception obtaining parameters 
     com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:425) 
     com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537) 
     com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699) 
     javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
root cause 
com.sun.jersey.api.container.ContainerException: Exception obtaining parameters 
     com.sun.jersey.server.impl.inject.InjectableValuesProvider.getInjectableValues(InjectableValuesProvider.java:54) 
     com.sun.jersey.multipart.impl.FormDataMultiPartDispatchProvider$FormDataInjectableValuesProvider.getInjectableValues(FormDataMultiPartDispatchProvider.java:125) 
     com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$EntityParamInInvoker.getParams(AbstractResourceMethodDispatchProvider.java:153) 
     com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:203) 
     com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75) 
     com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288) 
     com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) 
     com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108) 
     com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) 
     com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84) 
     com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469) 
     com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400) 
     com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349) 
     com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339) 
     com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416) 
     com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537) 
     com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699) 
     javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
root cause 
java.lang.IllegalStateException: The @FormParam is utilized when the content type of the request entity is not application/x-www-form-urlencoded 
     com.sun.jersey.server.impl.model.parameter.FormParamInjectableProvider$FormParamInjectable.getValue(FormParamInjectableProvider.java:81) 
     com.sun.jersey.server.impl.inject.InjectableValuesProvider.getInjectableValues(InjectableValuesProvider.java:46) 
     com.sun.jersey.multipart.impl.FormDataMultiPartDispatchProvider$FormDataInjectableValuesProvider.getInjectableValues(FormDataMultiPartDispatchProvider.java:125) 
     com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$EntityParamInInvoker.getParams(AbstractResourceMethodDispatchProvider.java:153) 
     com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:203) 
     com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75) 
     com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288) 
     com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) 
     com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108) 
     com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) 
     com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84) 
     com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469) 
     com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400) 
     com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349) 
     com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339) 
     com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416) 
     com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537) 
     com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699) 
     javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 

Antwort

8

Ich habe in unter-Klasse und ihre adaequat Unterschrift des Verfahrens aktualisiert. Anstelle von @FormParam, verwendet @FormDataParam("path") String-Pfad und es löste mein Problem. Unten ist der aktualisierte Code:

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 

import javax.ws.rs.Consumes; 
import javax.ws.rs.FormParam; 
import javax.ws.rs.POST; 
import javax.ws.rs.Path; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 

import com.sun.jersey.core.header.FormDataContentDisposition; 
import com.sun.jersey.multipart.FormDataParam; 

@Path("/file") 
public class UploadFileService { 

@POST 
@Path("/upload") 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
public Response uploadFile(
     @FormDataParam("file") InputStream uploadedInputStream, 
     @FormDataParam("file") FormDataContentDisposition fileDetail, 
     @FormDataParam("path") String path) { 


    // Path format //10.217.14.97/Installables/uploaded/ 
    System.out.println("path::"+path); 
    String uploadedFileLocation = path 
      + fileDetail.getFileName(); 

    // save it 
    writeToFile(uploadedInputStream, uploadedFileLocation); 

    String output = "File uploaded to : " + uploadedFileLocation; 

    return Response.status(200).entity(output).build(); 

} 

// save uploaded file to new location 
private void writeToFile(InputStream uploadedInputStream, 
     String uploadedFileLocation) { 

    try { 
     OutputStream out = new FileOutputStream(new File(
       uploadedFileLocation)); 
     int read = 0; 
     byte[] bytes = new byte[1024]; 

     out = new FileOutputStream(new File(uploadedFileLocation)); 
     while ((read = uploadedInputStream.read(bytes)) != -1) { 
      out.write(bytes, 0, read); 
     } 
     out.flush(); 
     out.close(); 
    } catch (IOException e) { 

     e.printStackTrace(); 
    } 

    } 

    } 
+0

wird der Java-Code jede Art von Datei akzeptieren und speichern Sie sie in der definierten Position? Ich möchte Datei-Typen wie .pdf, .doc speichern, .jpg –

+0

wenn über Code Probleme mit Gläsern hat diesen Maven Import verwenden: com.sun.jersey Jersey-Server 1,8 com.sun.jersey.contribs Jersey-mehrt 1,8

1

Eine andere mögliche Lösung

@Consumes Annotation und legen Sie es Oktett Stream-Anwendung. Verwenden Sie die PUT http-Methode. Lesen Sie dann im Client Bytes aus der Datei und laden Sie sie hoch.

Mein Beispielcode für einen REST-Service ist hier eine Datei zip - https://stackoverflow.com/a/32253028/15789

Hoffnung, das hilft.