Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> загрузка файла в БД 
:(
    Опции темы
Swatch
Дата 9.4.2008, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 453
Регистрация: 2.7.2007

Репутация: 1
Всего: 1



Добрый день. 

Подскажите, пожалуйста, как с помощью JSP, Struts добавить файл в базу данных??? я знаю саму реализацию сохранения файла, но умею делать это для обычного приложения, а не для вэб. И с трудом представляю, как на вэб страничке, нажав на кнопку выбрать файл с компа и куда вписывать сохранение.... smile 

PM MAIL   Вверх
almostlost
Дата 9.4.2008, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 3.5.2007

Репутация: нет
Всего: нет



файл нельзя сохранить в базу данных. Вы можете сохранить сайл на сервере, а через базу данных получать ссылку на этот файл. Принцип сохранения файла немного другой чем в обычном приложении.
Вопервых, Вам следует использовать что-то типа этой формы:

Код

        <form enctype="multipart/form-data" action="upload" method="post">
           <input type="hidden" name="MAX_FILE_SIZE" value="300000">
           <font class="other_font">Send this file:</font>
           <input name="myfile" type="file" class="input_class">
           <input type="submit" value="send" class="input_class">
        </form>

при нажатии на кнопку "send" сервлет upload должен принимять поток. Часть сервлета описана тут:
Код

/*
Импортируем необходимые классы
*/
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
import org.apache.commons.fileupload.*;


public class FileUploadServlet extends HttpServlet{

  public void doPost(HttpServletRequest request, HttpServletResponse response)
     throws IOException,ServletException{
         
   DiskFileUpload upload = new DiskFileUpload();
   upload.setSizeMax(1024*50); //максимальный объем принимаемых данных в байтах
   upload.setRepositoryPath("/home/web/аккаунт/home/домен"); //путь к временной директории
   /*
   Путь к временной директории должен задаваться с учетом реального расположения
   Вашего сайта на жестком диске сервера. Для определения реального пути к домашней
   директории своего сайта можно использовать следующую конструкцию:
   ServletContext context=getServletContext();
   String path=context.getRealPath("/");
   После чего путь к временной папке Вы можете задавать относительно
   домашней директории своего сайта.
   */
    try{
      List list = upload.parseRequest( request );
      Iterator it = list.iterator();
      while ( it.hasNext() ) {
        ...
      }
    } catch ( Exception e ) {
      log( "Upload Error" , e);
    }
  }
}



почитайте мануал о библиотеке FileUpload.
тут
удачи!



Это сообщение отредактировал(а) almostlost - 9.4.2008, 16:28
PM MAIL   Вверх
Swatch
Дата 10.4.2008, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 453
Регистрация: 2.7.2007

Репутация: 1
Всего: 1



так, с самой формой все понятно...

относительно сервлета... я использую стратс, у меня есть 2 класика: AddForm и AddAction.

AddForm 
Код

private String title = null;
    private File file = null;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public File getFile() {
        return file;
    }

    public void setFile(File file) {
        this.file = file;
    }


AddAction
Код

public ActionForward execute(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception, ServletException {
        String target = "main";

        String title = ((DocListForm) actionForm).getTitle();
        File file = ((DocListForm) actionForm).getFile();
        HttpSession session = httpServletRequest.getSession();
        String author = (String)session.getAttribute("USER");
        Date data = new Date();

        DiskFileUpload upload = new DiskFileUpload();
        upload.setSizeMax(1024*50); //максимальный объем принимаемых данных в байтах
        String path = "/docs";
        upload.setRepositoryPath(path); //путь к временной директории

        FileInputStream fis = new FileInputStream(file);
        byte[] blob = new byte[(int) file.length()];
        fis.read(blob);

        doc document = new doc();
        document.setTitle(title);
        document.setAttachment(blob);
        document.setDate(data);
        document.setAuthor(author);
        HibernateUtil.Save(document);
              
        return actionMapping.findForward(target);
    }


не понимаю я так и, как сервлет переделать под свой AddAction.  smile в итоге, по нажатию на сэнд у меня возникает ошибка java.io.FileNotFoundException: 1.txt... 

как все-таки AddAction правильно должен выглядеть? smile

Добавлено через 3 минуты и 21 секунду
да, и все-таки еще, как указать путь к подкаталогу программы, чтобы туда сохранялись файлы?
PM MAIL   Вверх
Llucas
Дата 10.4.2008, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


J2EE Developer
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 29.11.2006
Где: Одесса

Репутация: нет
Всего: нет



Цитата

файл нельзя сохранить в базу данных.


А почему это нельзя сохранить файл в БД?



Код

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";
    }// - пример

PM MAIL WWW   Вверх
Swatch
Дата 10.4.2008, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 453
Регистрация: 2.7.2007

Репутация: 1
Всего: 1



я тоже не совсем поняла, почему нельзя сохранять файл в базу.... однако, волнует не это... почему у меня не находится файл и как сделать так, чтоб находился???
PM MAIL   Вверх
KostenkoSergey
Дата 10.4.2008, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 31.10.2005
Где: Kiev

Репутация: 3
Всего: 8



Как сказал almostlost, загрузить файл на сервер можно используя org.apache.commons.fileupload

В конечном счёте, в сервлете у тебя будет просто поток байт:

Код

 byte[] data = item.get();


Его то через  обычный jdbc и можно залить в СУБД.

Често говоря, я не вижу надобности и смысла сохранять загруженный файл вначале на файловой системе, а потом отдуда заливать в базу.

зы. или я чёт не так допонял ?  smile 



Это сообщение отредактировал(а) KostenkoSergey - 10.4.2008, 10:44
PM ICQ   Вверх
Swatch
Дата 10.4.2008, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 453
Регистрация: 2.7.2007

Репутация: 1
Всего: 1



а что еще за item.get();??? что это, откуда взялось и где его использовать???

а сохранять надо и туда, и туда...
PM MAIL   Вверх
KostenkoSergey
Дата 10.4.2008, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 31.10.2005
Где: Kiev

Репутация: 3
Всего: 8



Цитата(Swatch @  10.4.2008,  11:43 Найти цитируемый пост)
а что еще за item.get();??? что это, откуда взялось и где его использовать???

а сохранять надо и туда, и туда... 


Мне нужно было получать файлы, и обрабатывать их.  Делал так (может пригодится): 

Код

  public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType(CONTENT_TYPE);
    PrintWriter out = response.getWriter();

    try {
      // Check that we have a file upload request
      //boolean isMultipart = ServletFileUpload.isMultipartContent(request);
      // Create a factory for disk-based file items
      FileItemFactory factory = new DiskFileItemFactory();
      // Create a new file upload handler
      ServletFileUpload upload = new ServletFileUpload(factory);
      // Parse the request
      List /* FileItem */ items = upload.parseRequest(request);
      // Process the uploaded items
      Iterator iter = items.iterator();
      while (iter.hasNext()) {
        FileItem item = (FileItem) iter.next();
        if (!item.isFormField()) {
          if (item.getSize() > 0) {
            String fieldName = item.getFieldName();
            // Process a file upload in memory
            byte[] data = item.get();

            //if (fieldName.startsWith("xml")) {
            // azProcessor.process(AzProcess.XML_FILE,data);
            //}
            //else if (fieldName.startsWith("pdf")) {
            //  azProcessor.process(AzProcess.PDF_FILE,data);
            //}
          }
        }
      }

    }
    catch (Exception ex) {
      throw new ServletException(ex);
    }

  }


Так вот byte[] data, это и будет твой файл.   Дальше просто вставляешь этот массив в базу.


Это сообщение отредактировал(а) KostenkoSergey - 10.4.2008, 12:47
PM ICQ   Вверх
Swatch
Дата 10.4.2008, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 453
Регистрация: 2.7.2007

Репутация: 1
Всего: 1



Возник еще один вопрос: а в стратс-конфиг надо что-то записывать??? что? ведь если туда ничего не записать, то по нажатию на кнопку, по которой должна происходить загрузка файла, будет совершена попытка перейти по адресу http://localhost:8080/upload !!! а такого адреса нет:(

Добавлено через 2 минуты и 52 секунды
Спасибо, я уже тоже что-то подобное сделалаsmile 
PM MAIL   Вверх
Swatch
Дата 11.4.2008, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 453
Регистрация: 2.7.2007

Репутация: 1
Всего: 1



написала так
Код

public class UploadAction extends Action/*, HttpServlet */{

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {

        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
        FileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);

        try {
            List  items = upload.parseRequest(request);
            Iterator iter = items.iterator();
            while (iter.hasNext()) {
                FileItem item = (FileItem) iter.next();

                File uploadedFile = new File("c://");
                try {
                    item.write(uploadedFile);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                HttpSession session = request.getSession();
                user author = (user)session.getAttribute("USER");
                Date data = new Date();
                byte[] blob = item.get();
                doc document = new doc();
                document.setDate(data);
                document.setUser_id(author);
                HibernateUtil.Save(document);
            }    
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
    }

    public ActionForward execute(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception, ServletException {
        doPost(httpServletRequest, httpServletResponse);
        return actionMapping.findForward("main");
    }
}


jsp-файл:
Код

<html>
    <body>
        <html:form action="/upload">
            <form enctype="multipart/form-data" action="/upload" method="post">
                <table>
                    <tr>
                        <td><font class="other_font">File title:</font></td>
                        <td><input name="title" type="text" class="input_class">  </td>
                    </tr>
                    <tr>
                        <input type="hidden" name="MAX_FILE_SIZE" value="300000">
                        <td><font class="other_font">Loading file:</font></td>
                        <td><input name="file" type="file" class="input_class"></td>
                        <td><input type="submit" value="Load" class="input_class"></td>
                    </tr>
                </table>
            </form>
        </html:form>
    </body>
</html>


но теперь вылетает с ошибкой:
Код

org.apache.commons.fileupload.FileUploadBase$InvalidContentTypeException: the request doesn't contain a multipart/form-data or multipart/mixed stream, content type header is application/x-www-form-urlencoded
    at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:294)
    at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:116)
    at com.myapp.logic.UploadAction.doPost(UploadAction.java:46)
    at com.myapp.logic.UploadAction.execute(UploadAction.java:78)
    at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:425)
    at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228)
    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
    at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
    at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
    at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
    at java.lang.Thread.run(Thread.java:619)


ЧТО ДЕЛАТЬ??? smile  smile  smile 
PM MAIL   Вверх
Kangaroo
Дата 11.4.2008, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 14
Всего: 104



Цитата(Swatch @  11.4.2008,  14:12 Найти цитируемый пост)
<html:form action="/upload">
            <form enctype="multipart/form-data" action="/upload" method="post">

Зачем у тебя две формы? Убери внешнюю.


--------------------
Lost....
PM MAIL MSN   Вверх
Swatch
Дата 11.4.2008, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 453
Регистрация: 2.7.2007

Репутация: 1
Всего: 1



если убрать, то пишет:
Код

еxception

javax.servlet.ServletException: BeanUtils.populate
    org.apache.struts.util.RequestUtils.populate(RequestUtils.java:469)
    org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:818)
    org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:194)
    org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
    org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

root cause

java.lang.IllegalArgumentException: Cannot invoke com.myapp.logic.UploadForm.setFile - argument type mismatch
    org.apache.commons.beanutils.PropertyUtilsBean.invokeMethod(PropertyUtilsBean.java:1778)
    org.apache.commons.beanutils.PropertyUtilsBean.setSimpleProperty(PropertyUtilsBean.java:1759)
    org.apache.commons.beanutils.PropertyUtilsBean.setNestedProperty(PropertyUtilsBean.java:1648)
    org.apache.commons.beanutils.PropertyUtilsBean.setProperty(PropertyUtilsBean.java:1677)
    org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:1022)
    org.apache.commons.beanutils.BeanUtilsBean.populate(BeanUtilsBean.java:811)
    org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:298)
    org.apache.struts.util.RequestUtils.populate(RequestUtils.java:467)
    org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:818)
    org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:194)
    org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
    org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)


PM MAIL   Вверх
Kangaroo
Дата 11.4.2008, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 14
Всего: 104



Цитата(Swatch @  11.4.2008,  14:31 Найти цитируемый пост)
Cannot invoke com.myapp.logic.UploadForm.setFile - argument type mismatch

Тип должен быть byte[], а у тебя какой?


--------------------
Lost....
PM MAIL MSN   Вверх
Swatch
Дата 11.4.2008, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 453
Регистрация: 2.7.2007

Репутация: 1
Всего: 1



вот UploadForm:
Код

public class UploadForm extends ActionForm {
    private String title = null;
    private byte[] file = null;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public byte[] getFile() {
        return file;
    }

    public void setFile(byte[] file) {
        this.file = file;
    }
}


пытаюсь добавить обычный *.txt-файл....
PM MAIL   Вверх
shoura
Дата 6.5.2008, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 20.10.2006

Репутация: нет
Всего: нет



Интересно зачем вообще в бине UploadForm get/setFile() если по факту он в Action-е не используется?

Мало того, с помощью бина удастся получить только название файла ибо в параметры кладется только оно.

Байтовый поток идет отдельной частью в запросе, собственно поэтому и multipart...
Поэтому правильный тип - String  smile 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1034 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.