Схема URI не "файл" - PullRequest
       45

Схема URI не "файл"

13 голосов
/ 16 мая 2010

Я получаю исключение: "Схема URI не является файлом"

Я пытаюсь получить имя файла и затем сохранить этот файл (с другого сервера) на моем компьютере / сервере из сервлета.

У меня есть строка под названием "url", отсюда мой код:

url = Streams.asString(stream); //gets the URL from a form on a webpage
System.out.println("This is the URL: "+url);
URI fileUri = new URI(url);

File fileFromUri = new File(fileUri);                   

onlyFile = fileFromUri.getName(); 
URL fileUrl = new URL(url);
InputStream imageStream = fileUrl.openStream();
String fileLoc2 = getServletContext().getRealPath("pics/"+onlyFile);

File newFolder = new File(getServletContext().getRealPath("pics"));
    if(!newFolder.exists()){
        newFolder.mkdir();
    }
    IOUtils.copy(imageStream, new FileOutputStream("pics/"+onlyFile));
} 

Вот строка, вызывающая ошибку:

File fileFromUri = new File(fileUri);                   

Я добавил остальную часть кода, чтобы вы могли видеть, что я пытаюсь сделать.

Ответы [ 2 ]

25 голосов
/ 16 мая 2010

URI "схема" - это то, что стоит перед ":", например, "http" в "http://stackoverflow.com".

В сообщении об ошибке сообщается, что new File(fileUri) работает только для "file:" URI (тех, которые ссылаются на путь в текущей системе), но не для других схем, таких как "http".

По сути, URI "file:" - это еще один способ указать путь к классу File. Это не магический способ сказать File использовать http для загрузки файла из Интернета.

3 голосов
/ 16 мая 2010

Ваше предположение о создании File из URL здесь неверно.

Вам просто не нужно создавать File из URL-адреса файла в Интернете, чтобы вы могли получитьимя файла.

Вы можете просто сделать это с помощью парсинга URL:

URL fileUri = new URL("http://local.wasp.uwa.edu.au/~pbourke/miscellaneous/domefisheye/ladybug/fish4.jpg");    
int startIndex = fileUri.toString().lastIndexOf('/');
String fileName = fileUri.toString().substring(startIndex + 1);
System.out.println(fileName);
...