¿Por qué tengo errores de eliminación de archivos no deterministas cuando uso DiskFileItem?

StackOverflow https://stackoverflow.com/questions/8313117

  •  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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top