¿Por qué tengo errores de eliminación de archivos no deterministas cuando uso DiskFileItem?
-
25-10-2019 - |
Pregunta
Mi servlet de carga sigue lanzándome una excepción diciendo que el archivo que estoy tratando de reemplazar (cerca del final de mi código) no se pudo eliminar al azar (aparentemente). No sé qué está causando esto, ya que no estoy usando transmisiones y el archivo no está abierto en mi navegador. ¿Alguien sabe qué podría estar causando esto? No tengo idea de este, ya que el código me parece correcto. Esta es la primera vez que use DiskFileItem, así que no estoy seguro de si hay matices que manejar allí.
Tenga en cuenta que a veces funciona, a veces no. Estoy perdido en eso.
Área problemática:
File destination = new File(wellnessDir + File.separator + fileName + ".pdf");
System.out.println("destination file exists: " + destination.exists());
System.out.println("file to be moved exists: " + uploadedFile.exists());
if(destination.exists()){
boolean deleted = destination.delete();
if(!deleted)
throw new Exception("Could not delete file at " + destination);
}
Mi sistema siempre dice que existen archivos como de destino. Estoy tratando de obtener la carga para sobrescribir el archivo existente.
Código completo: (y pasta)
private void uploadRequestHandler(ServletFileUpload upload, HttpServletRequest request)
{
// Handle the request
String fileName = "blank";
try{
List items = upload.parseRequest(request);
//Process the uploaded items
Iterator iter = items.iterator();
File uploadedFile = new File(getHome() + File.separator + "temp");
if(uploadedFile.exists()){
boolean tempDeleted = uploadedFile.delete();
if(!tempDeleted)
throw new Exception("Existing temp file could not be deleted.");
}
//write the file
while (iter.hasNext()) {
DiskFileItem item = (DiskFileItem) iter.next();
if(item.isFormField()){
String fieldName = item.getFieldName();
String fieldValue = item.getString();
if(fieldName.equals("fileName"))
fileName = fieldValue;
//other form values would need to be handled here, right now only need for fileName
}else{
item.write(uploadedFile);
}
}
if(fileName.equals("blank"))
throw new Exception("File name could not be parsed.");
//move file
File wellnessDir = new File(getHome() + File.separator + "medcottage" + File.separator + "wellness");
File destination = new File(wellnessDir + File.separator + fileName + ".pdf");
System.out.println("destination file exists: " + destination.exists());
System.out.println("file to be moved exists: " + uploadedFile.exists());
if(destination.exists()){
boolean deleted = destination.delete();
if(!deleted)
throw new Exception("Could not delete file at " + destination);
}
FileUtil.move(uploadedFile, new File(wellnessDir + File.separator + fileName + ".pdf"));
writeResponse();
} catch (Exception e) {
System.out.println("Error handling upload request.");
e.printStackTrace();
}
}
Editar: para agregar, gethome () y "hogar" no están realmente en el código, eso es solo para proteger mi camino de casa
Solución
Después de muchas pruebas y agravaciones, finalmente lo probé en una máquina diferente, el mismo código, funcionó muy bien. Tiene algo que ver conmigo transfiriendo dominios en mi máquina de trabajo y se mete con los permisos.