У меня есть настройка API, которая, если вы выберете указанный путь c в подпапке домена api, будет проверять, существует ли этот путь в подпапке img, и если да, выдает случайное изображение (когда или ошибка.
Допустим, у меня есть папка с именем dogs
, которая находится внутри var/www/html/img
и содержит несколько изображений собак, если я сейчас подключусь к https://example.com/api/img/dogs
, вернется ли она JSON со случайно выбранной ссылкой на изображение, которая выглядит следующим образом:
{
"code": 200,
"link": "https://example.com/img/dogs/dog_005.jpg"
}
Мой код такой:
public class ImageAPI{
private Random random = new Random();
private Logger logger = (Logger)LoggerFactory.getLogger(ImageAPI.class);
private List<String> extensions = Arrays.asList(".png", ".jpg", ".jpeg", ".gif", ".svg");
private File base = new File("img/");
private FilenameFilter filter = (dir, name) -> {
for(String ext : extensions)
if(name.endsWith(ext))
return true;
return false;
};
public static void main(String[] args){
new ImageAPI().boot();
}
private void boot(){
logger.info("Starting ImageAPI...");
if(!base.exists()){
logger.info("Couldn't find base folder. Generating it...");
//noinspection ResultOfMethodCallIgnored
base.mkdir();
}
Spark.initExceptionHandler(e -> logger.error("Caught an exception", e));
Spark.ipAddress("127.0.0.1");
Spark.port(8001);
Spark.get("/api/img/*", (request, response) -> {
String path = request.pathInfo().replaceFirst("/api/img/", "").replace("../", "");
File file = new File(base, path + "/");
JSONObject json = new JSONObject();
if(!file.exists() || file.isAbsolute()){
json.put("code", 403).put("message", "Not supported API path.");
response.status(403);
}else{
File[] files = file.listFiles(filter);
if(files == null || files.length == 0){
json.put("code", 403).put("message", "The selected directory doesn't contain any images.");
response.status(403);
}else{
File selected = files[random.nextInt(files.length)];
json.put("code", 200).put("link", generateLink(selected));
response.status(200);
}
}
response.type("application/json");
response.body(json.toString());
return response.body();
});
}
private String generateLink(File file){
return ("https://example.com/" + file.getPath()).replace("\\", "/");
}
}
Теперь мой вопрос / проблема: Я хочу изменить этот код таким образом, он будет отображать подпапки, если в той, в которой вы находитесь, есть некоторые, желательно с полным путем.
Например, когда я подключаюсь к https://example.com/api/img/animals
и у него есть подпапки cats
и dogs
, если json содержит дополнительный JSONArray с папками, перечисленными следующим образом:
{
"subfolders": [
"cats",
"dogs"
]
}
Было бы также полезно, если бы установленные мной ошибки намекали на доступные подпапки если доступно, но это не обязательно.
Какой самый чистый способ сделать это?
Я использую Spark java для обработки содержимого веб-фреймворка и других, чем просто простые Java методы, классы, ...
Сам сайт размещен на VPS с использованием Ubuntu с Nginx, а файл conf настроен на автоматическое изменение порта на 8001 для всех запросов к подкаталогу /api/img
.