java guardar archivo en servidor
@MultipartForm ¿Cómo obtener el nombre del archivo original? (3)
Estoy usando el proveedor multiparts easy-rest de jboss para importar un archivo. Leí aquí http://docs.jboss.org/resteasy/docs/1.0.0.GA/userguide/html/Content_Marshalling_Providers.html#multipartform_annotation con respecto a @MultipartForm porque puedo mapearlo exactamente con mi POJO.
A continuación está mi POJO
public class SoftwarePackageForm {
@FormParam("softwarePackage")
private File file;
private String contentDisposition;
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public String getContentDisposition() {
return contentDisposition;
}
public void setContentDisposition(String contentDisposition) {
this.contentDisposition = contentDisposition;
}
}
Luego obtuve el objeto de archivo e imprimí su ruta absoluta y devolvió un nombre de archivo de tipo archivo. La extensión y el nombre del archivo cargado se pierden. Mi cliente está tratando de cargar un archivo (zip, tar, z)
Necesito esta información en el lado del servidor para que pueda aplicar el programa de eliminación de archivos correctamente.
El nombre del archivo original se envía al servidor en el encabezado de disposición de contenido.
¿Cómo puedo obtener esta información? O al menos, ¿cómo puedo decir que jboss guarde el archivo con el nombre de archivo y la extensión cargados? ¿Es configurable desde mi aplicación?
Después de buscar un poco ejemplos de Resteasy, incluido este, parece que no hay forma de recuperar el nombre de archivo original y la información de extensión cuando se utiliza una clase POJO con la anotación @MultipartForm
.
Los ejemplos que he visto hasta ahora recuperan el nombre de archivo del encabezado Content-Disposition
desde la parte "file" de los datos de formulario multiparte enviados a través de HTTP POST, que esencialmente se ve como:
Content-Disposition: form-data; name="file"; filename="your_file.zip"
Content-Type: application/zip
Deberá actualizar su clase de servicio REST de carga de archivos para extraer este encabezado así:
@POST
@Path("/upload")
@Consumes("multipart/form-data")
public Response uploadFile(MultipartFormDataInput input) {
String fileName = "";
Map<String, List<InputPart>> formParts = input.getFormDataMap();
List<InputPart> inPart = formParts.get("file"); // "file" should match the name attribute of your HTML file input
for (InputPart inputPart : inPart) {
try {
// Retrieve headers, read the Content-Disposition header to obtain the original name of the file
MultivaluedMap<String, String> headers = inputPart.getHeaders();
String[] contentDispositionHeader = headers.getFirst("Content-Disposition").split(";");
for (String name : contentDispositionHeader) {
if ((name.trim().startsWith("filename"))) {
String[] tmp = name.split("=");
fileName = tmp[1].trim().replaceAll("/"","");
}
}
// Handle the body of that part with an InputStream
InputStream istream = inputPart.getBody(InputStream.class,null);
/* ..etc.. */
}
catch (IOException e) {
e.printStackTrace();
}
}
String msgOutput = "Successfully uploaded file " + filename;
return Response.status(200).entity(msgOutput).build();
}
Espero que esto ayude.
Puede usar @PartFilename, pero desafortunadamente esto actualmente solo se usa para escribir formularios, no para leer formularios: RESTEASY-1069 .
Hasta que este problema se solucione, podría usar MultipartFormDataInput
como parámetro para su método de recursos.
Parece que Isim tiene razón, pero hay una solución.
Cree un campo oculto en su formulario y actualice su valor con el nombre del archivo seleccionado. Cuando se envía el formulario, el nombre del archivo se enviará como @FormParam.
Aquí hay un código que podría necesitar (se requiere jquery).
<input id="the-file" type="file" name="file">
<input id="the-filename" type="hidden" name="filename">
<script>
$(''#the-file'').on(''change'', function(e) {
var filename = $(this).val();
var lastIndex = filename.lastIndexOf(''//');
if (lastIndex < 0) {
lastIndex = filename.lastIndexOf(''/'');
}
if (lastIndex >= 0) {
filename = filename.substring(lastIndex + 1);
}
$(''#the-filename'').val(filename);
});
</script>