Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > upload файла, сохранение и открытие его


Автор: Swatch 12.4.2008, 12:12
Добрый день.

Делаю upload файла и сохраняю его в БД, при этом его еще надо сохранить в поддиректорию приложения... 

upload файла:
Код

public ActionForward execute(ActionMapping mapping,
                                 ActionForm form,
                                 HttpServletRequest request,
                                 HttpServletResponse response) throws Exception {

        if ( form != null ) {

            DynaActionForm df = (DynaActionForm) form;
            FormFile file   = (FormFile) df.get("file");
            String title     = (String)   df.get("title");
            Date data = new Date();
            HttpSession session = request.getSession();
            user author = (user)session.getAttribute("USER");
            Blob blob = Hibernate.createBlob (file.getInputStream());
            byte[] f = new byte[(int) blob.length()];

            doc doc = new doc();
            doc.setTitle(title);
            doc.setDate(data);
            doc.setUser_id(author);
            doc.setAttachment(f);
            HibernateUtil.Save(doc);
            
        }

        return (mapping.findForward("main"));
     }


Это нормально работает и в БД все сохраняется... вопрос в том, как сделать сохранение в поддиректорию программы??? 

и еще, можно ли потом файл открыть в соответствующем редакторе... ну, как бывает, нажимаешь на ссылку, а тебе предлагают открыть/сохранить на диск... как это можно реализовать????

Автор: Samotnik 12.4.2008, 16:34
Цитата(Swatch @  12.4.2008,  12:12 Найти цитируемый пост)
вопрос в том, как сделать сохранение в поддиректорию программы??? 

а обычным спопобом (не через хибернейт)  пробывали ?   

Автор: Swatch 13.4.2008, 08:35
Я понимаю, что обычным... только не совсем понимаю, как...  smile 

Автор: Samotnik 13.4.2008, 11:38
Цитата(Swatch @  13.4.2008,  08:35 Найти цитируемый пост)
Я понимаю, что обычным... только не совсем понимаю, как...  

Взять нужное  содержимое (к примеру оно будет находится в  String  tmp ),  написать что то вроде 
Код

FileOutputStream fos = new  FileOutputStream("D:\\work\\project\\bla-bla")
for(int i=0; tmp.length;i++ )
fos.write(tmp[i]);

Ну т.е.  попробуйте через обычную работу с файлом.  

Автор: Swatch 13.4.2008, 20:34
файл сохранился... спасибо за совет!smile 

только возник вопрос, как определить поддиректорию приложения???

Автор: Samotnik 13.4.2008, 20:40
Цитата(Swatch @  13.4.2008,  20:34 Найти цитируемый пост)
только возник вопрос, как определить поддиректорию приложения???

в смысле ?
вы про это ?
Код

File f  = new File ("ваш файл");
f.getName();   //имя 
f.getPath(); //путь 
f.getAbsolutePath();


Автор: Swatch 13.4.2008, 21:06
теперь еще и с открытием файла проблемы... открывать, открывает, но файлы пустые:(

вот открытие:
Код

Long id = null;

        id = ((MainForm) actionForm).getId();
        doc doc = new doc();
        HibernateUtil.Load(doc, id);

        byte[] file = doc.getAttachment();
        File f = File.createTempFile("attachement", doc.getExtension());
        FileOutputStream fos = new FileOutputStream(f);
        try {
            fos.write(file);
        } catch (IOException ex2) {
            ex2.printStackTrace();
        }
        fos.close();
        String file_name = f.getCanonicalPath();         
        Runtime.getRuntime().exec("cmd /C " + "\"" + file_name + "\"");
        f.deleteOnExit();
        return (actionMapping.findForward("main"));


в чем может быть дело???

Добавлено через 2 минуты и 40 секунд
эммм.. нет, мне надо не путь до файла определить, а путь к поддиректории программы, куда сохранить файл, то есть когда я делаю:
Код

FileOutputStream fos = new  FileOutputStream(путь к поддиректории программы... как найти???);

Автор: Samotnik 14.4.2008, 12:00
Цитата(Swatch @  13.4.2008,  21:06 Найти цитируемый пост)
теперь еще и с открытием файла проблемы... открывать, открывает, но файлы пустые:(

не понял,  что тебе тут конкретно нужно ?
ведь, этой строкой  ты хочеш что то записать в файл   
Код

 FileOutputStream fos = new FileOutputStream(f);

а он всегда будет либо перезаписываться, либо  создаваться, если его не существует ! 
Цитата(Swatch @  13.4.2008,  21:06 Найти цитируемый пост)
эммм.. нет, мне надо не путь до файла определить, а путь к поддиректории программы, куда сохранить файл, то есть когда я делаю:

опять не понял ...  Ведь это ВАШ проект, и вы сохраняете туда, куда ВЫ  захотите!  Обычно это делается в папочку типа..  resources
Обьясни поподробнее,  что значит "как  найти путь"

Автор: Swatch 14.4.2008, 13:17
ФАйл записывается нормально, но когда я его потом открываю, то там вместо его содержимого только квадратики...

на счет сохранения. все понятно, что сохраняю в resources, например... только ведь путь надо писать относительный к этим resources... ведь если я напишу c://.../resources/, то не факт, что если программу перенести на другой комп, она будет работать... вот я и не знаю, как задать относительный путь просто к папке resources, которая в проекте лежит... то есть надо как-то ориентироваться на проект, только я не совсем понимаю, как...

Автор: Samotnik 14.4.2008, 13:30
Цитата(Swatch @  14.4.2008,  13:17 Найти цитируемый пост)
а счет сохранения. все понятно, что сохраняю в resources, например... только ведь путь надо писать относительный к этим resources... ведь если я напишу c://.../resources/, то не факт, что если программу перенести на другой комп, она будет работать... вот я и не знаю, как задать относительный путь просто к папке resources, которая в проекте лежит... то есть надо как-то ориентироваться на проект, только я не совсем понимаю, как... 

да, правилно, конечно же  нужно писать относительный путь..   
ДОПУСТИМ,  у тебя такая ерерархия проекта :
Код

D:\\ptroject\\MyLoveProject\\java\\ src\\MyFile.java  (тот   java   файл  в которм  ты  работаеш с   txt   файолм  (запись, чтение))
                           \\resuorces\\file resources\\ Need.txt (тот который сюда нужно положить)
                           \\tests\\
                                             ну  и т.д.

Значіт относітельный путь  будет 
Код

..\\..\\resuorces\\file resources\\ Need.txt

..    -  это   поднятся  на уровень вверх.   Т.е.  если правильно задеплоится  проект, то иеррархия  должна остаться,  и обсолютно  пофигу  на каком диске и в какой папке будет лежать проект,  папки java  resuorces  tests   остануться  так как есть ...

Добавлено @ 13:34
Цитата(Swatch @  14.4.2008,  13:17 Найти цитируемый пост)
но когда я его потом открываю, то там вместо его содержимого только квадратики...

я не вижу, когда  где файл открывается  для чтения  smile 

Автор: Swatch 14.4.2008, 14:26
хммм... что-то у меня не находит папку resuorces.... может потому, что у меня нет папки java, а иерархия такая:
d://MyProject//src//myapp//
                     //resuorces//
                     //web//web-inf

Автор: Samotnik 14.4.2008, 14:29
Цитата(Swatch @  14.4.2008,  14:26 Найти цитируемый пост)
может потому, что у меня нет папки java, а иерархия такая:

ну конечно, я же пример написал!   smile 

Цитата(Swatch @  14.4.2008,  14:26 Найти цитируемый пост)
d://MyProject//src//myapp//
                     //resuorces//
                     //web//web-inf 

это твоя  иерархия ???
где лежит  .java  класс, который будет проводить манипуляции  с  .txt файлом (чтение, запись, и .т.д)  ?    И где лежит сам  .txt  файл ?
выложи полную иерархию !

Добавлено через 7 минут и 12 секунд
Значит если файл   .java     лежит  в d://MyProject//src//myapp//   а   .txt    лежит в d://MyProject//resuorces//  
то будет выглядеть доступ вот так : 
Код

..\\..\\resuorces\\


Автор: Swatch 14.4.2008, 14:38
d://MyProject//src//com//myapp//logic//classAction.java - это мой класс.
сам файлик, который я добавляю в БД, может лежать где угодно...

d://MyProject//resuorces// - сюда хочу сохранять файлики...


Автор: Samotnik 14.4.2008, 14:46
Swatch, для  этой  иерархии,  в классе  classAction.java ,  нужно прописать такой путь, при открытии  файла, который лежит в d://MyProject//resuorces//
..\\..\\..\\..\\resuorces\\

Автор: Swatch 14.4.2008, 15:08
Почему-то, хоть сколько FileOutputStream-у рисуй ..\\..\\..\\..\\, все равно складывается файлик в с://. не знаю, в чем дело....

Добавлено через 8 минут и 59 секунд
а если писать 
Код

FileOutputStream fos = new  FileOutputStream(title + extension);


то файл сохраниться в c:\\Tomcat\\bin

Автор: Samotnik 14.4.2008, 15:57
Swatch,  а елси написать, просто 
FileOutputStream fos = new  FileOutputStream(resuorces\\);
то куда сохранится  ? 
Вообще тебе   нужно узнать путь,  чтобы  знать от куда плясать, 
Сделай так
Код

File а = new File("твой файл"); 
System.out.println(a.getPath());
System.out.println(a.getAbsolutePath());

Какой путь выводится ? 

Автор: Swatch 15.4.2008, 06:29
getAbsolutePath() возврящает C:\TomCat\bin\myfile.txt

Автор: Samotnik 15.4.2008, 18:07
Цитата(Swatch @  15.4.2008,  06:29 Найти цитируемый пост)
getAbsolutePath() возврящает C:\TomCat\bin\myfile.txt 

не понимаю, что он там  делает   smile 
у тебя же проект в  d://MyProject//   лежит.... 
Возьми тогда, какой нить другой файл (которые лежит там где нужно)  и относительно его пропиши  путь для нового файла

Автор: Llucas 16.4.2008, 11:40
Можно спокойно определить относительный путь к корневой папке приложения и вообще не напрягаться 

Код

public static String getCurrentDirectory() throws IOException {
        File dir1 = new File (".");
        return dir1.getCanonicalPath();
    }
   

    public static String getTheSite() throws IOException {
        return "file:///"+ getCurrentDirectory() +"/resource/index.html";
    }




Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)