Я создаю простое клиент-серверное приложение, которое позволяет серверу получать файл от клиента. В этом приложении клиент также может решить, где хранить файл в файловой системе сервера, если он находится внутри заданного базового пути.
Проблема в том, что если клиент отправляет путь, сервер создает, т.е. эту строку как путь: C:\basePath\newFolder\file.xml
. Если newFolder
не существует в текущей файловой системе, выдается эта ошибка:
Error: C:\remtServer\prova\t.xml (Access denied)
А также эти две ошибки, но я думаю, что они неуместны, потому что они происходят от первой:
[Fatal Error] :1:8: XML document structures must start and end within the same entity.
Error: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 8; XML document structures must start and end within the same entity.
Я не очень разбираюсь в Java, поэтому, может быть, это тривиальный вопрос, но я не могу понять.
Это код на сервере:
public static void receive(String token, String fileName, String filePath, int length) throws IOException{
// Stream for binary data and file transfer
OutputStream out = new FileOutputStream(basePath + filePath + fileName);
InputStream in = socket.getInputStream();
// Variables
int bytesRead;
// Bytes for store info to be sent
byte[] buffer = new byte[length];
//-------------------------
// Send file
//-------------------------
while((bytesRead = in.read(buffer)) > 0){
out.write(buffer, 0, bytesRead);
if (bytesRead < 1024) {
break;
}
} // while
//-------------------------
// End of file transfer
//-------------------------
out.close();
} // receive
Ошибка возникает из-за того, что каталог не существует. Как я могу создать каталог, чтобы исправить это? Иначе как я могу это решить?
Или Files.createDirectories(Path.of(fileName).getParent());
На стороне сервера следующий код создает все каталоги (при условии, что Java, работающая на стороне сервера, имеет необходимые права доступа к файлам)
File f = ...; // The file path the client has submitted
File dir = null;
if (f.isFile()) {
dir = f.getParentFile();
} else dir = f;
dir.mkdirs();
new File(basePath + filePath).mkdirs()
создаст недостающие каталоги из этого пути.