Konfigurieren von Swagger UI, Jersey und Datei-upload?

Ich habe eine Jersey-Dienst mit einem Datei-upload-Methode sieht wie folgt aus (vereinfacht):

@POST
@Path("/{observationId : [a-zA-Z0-9_]+}/files")
@Produces({ MediaType.APPLICATION_JSON})
@Consumes(MediaType.MULTIPART_FORM_DATA)
@ApiOperation(
    value = "Add a file to an observation",
    notes = "Adds a file to an observation and returns a JSON representation of the uploaded file.",
    response = ObservationMediaFile.class
)
@ApiResponses({
    @ApiResponse(code = 404, message = "Observation not found. Invalid observation ID."),
    @ApiResponse(code = 406, message= "The media type of the uploaded file is not supported. Currently supported types are 'images/*' where '*' can be 'jpeg', 'gif', 'png' or 'tiff',")
})
public RestResponse<ObservationMediaFile> addFileToObservation(
    @PathParam("observationId") Long observationId,
    @FormDataParam("file") InputStream is,
    @FormDataParam("file") FormDataContentDisposition fileDetail,
    @FormDataParam("fileBodyPart") FormDataBodyPart body
){

    MediaType type = body.getMediaType();

    //Validate the media type of the uploaded file...
    if( /* validate it is an image */    ){
        throw new NotAcceptableException("Not an image. Get out.");
    }

    //do something with the content of the file
    try{
        byte[] bytes = IOUtils.toByteArray(is);
    }catch(IOException e){}

    //return response...
}

Es funktioniert und ich es testen kann erfolgreich mit Briefträger-Erweiterung in Chrome.

Jedoch, Swagger sieht 2 Parameter namens "Datei". Irgendwie scheint es zu verstehen, dass die InputStream parameter und die FormDataContentDisposition parameter sind eigentlich 2 Teile, die von den gleichen file parameter, aber es versäumt, zu sehen, dass für die FormDataBodyPart parameter.

Dies ist die Swagger JSON für die Parameter :

parameters: [
{
  name: "observationId",
  required: true,
  type: "integer",
  format: "int64",
  paramType: "path",
  allowMultiple: false
},
{
  name: "file",
  required: false,
  type: "File",
  paramType: "body",
  allowMultiple: false
},
{
  name: "fileBodyPart",
  required: false,
  type: "FormDataBodyPart",
  paramType: "form",
  allowMultiple: false
}]

Als Ergebnis, Swagger UI erzeugt ein Dateiauswahl-Feld, und ein extra Textfeld für den FormDataBodyPart argument :

Konfigurieren von Swagger UI, Jersey und Datei-upload?

Also, wenn ich wählen Sie eine Datei und schicken Sie das Formular in Swagger-UI, die ich am Ende der Lektüre der Inhalt des Textfeldes in den InputStream anstelle der Inhalt der hochgeladenen Datei. Und wenn ich das textfield leer ist, bekomme ich den Namen der Datei.

Wie kann ich anweisen, Swagger zu ignorieren, die FormDataBodyPart parameter ?

Alternativ als work-around, wie bekomme ich den media-Typ der hochgeladenen Datei ohne die FormDataBodyPart Objekt ?

Verwende ich Jersey 2.7 und Fors-jersey2-jaxrs_2.10 in der version 1.3.4.

Niemand weiß, ob diese Datei-upload ist möglich, mit jersey1? (Ich bin mit 1.19) Irgendwie komme ich nicht an die Datei-upload zu arbeiten, auch wenn ich multipart/form-data. Auch die in den Parametern als "Körper" und nicht als "Datei"

InformationsquelleAutor Pierre Henry | 2014-04-17

Schreibe einen Kommentar