Forum » Programiranje » Servlet
Servlet
snooze77 ::
Pozdravljeni, zanima me če kdo ve kako pridobiti .doc datoteko, ki jo shraniš v bazo. Shranjujem uspešno, vendar se mi zatakne ko je treba to datoteko pridobiti iz baze. to stvar pa moram realizirati s servleti.
Shranjevanje v bazo
Koda za sql
Pri pridobivanju datoteke pa ne vem točno kako naj stvar realiziram. Moralo bi tako izgledati, uporabnik vidi vse svoje datoteke, ki jih je uplovdu in po kliku na link bi se mu morala datoteka prenesti.
Če kdo to stvar obvlada bi ga prosim če mi malo bolj podrobno razloži kako to poteka.
Hvala
Shranjevanje v bazo
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); response.setCharacterEncoding("UTF-8"); request.setCharacterEncoding("UTF-8"); PrintWriter out = response.getWriter(); response.setContentType("text/plain"); if (ServletFileUpload.isMultipartContent(request)) { ServletFileUpload servletFileUpload = new ServletFileUpload(new DiskFileItemFactory()); try { List fileItemsList = servletFileUpload.parseRequest(request); Iterator it = fileItemsList.iterator(); while (it.hasNext()) { FileItem fileItem = (FileItem)it.next(); if (fileItem.isFormField()) { } else { InputStream fileStream = fileItem.getInputStream();//pretvorba Ukazibaza.VstaviDatoteko(fileStream);// klicanje SQL stavka } } } catch (FileUploadException ex) { Logger.getLogger(ShraniDatoteko.class.getName()).log(Level.SEVERE, null, ex); }
Koda za sql
public static void VstaviDatoteko(InputStream datoteka) { Connection c = povezava(); try { PreparedStatement ps = null; ps =(PreparedStatement) c.prepareStatement("INSERT INTO clanki(naslov,leto,povezava,tk_id_podrocje,datoteka) VALUES('a',1,'a',1,?)"); ps.setBinaryStream(1, datoteka); ps.executeUpdate(); System.out.println("nalozeno"); c.close(); } catch(Exception e) { System.out.println("napaka"); } }
Pri pridobivanju datoteke pa ne vem točno kako naj stvar realiziram. Moralo bi tako izgledati, uporabnik vidi vse svoje datoteke, ki jih je uplovdu in po kliku na link bi se mu morala datoteka prenesti.
http://shrani.si/f/2A/N/MrdfKIn/sqlstavek.png Tuki dobim datoteko in jo shranim kot InputStream. Nato pa jo vrnem servletu Koda:http://shrani.si/f/1Q/vg/XrGIMnP/servletpridobidatoteko.png
Če kdo to stvar obvlada bi ga prosim če mi malo bolj podrobno razloži kako to poteka.
Hvala
- spremenil: snooze77 ()
Greg91 ::
Servletu, ki bo hendlal download datotek pošlji preko POST ali GET metode id oz. atribut po katerem boš iskal zapis v bazi. Na tvojem mestu bi dodal v tabelo clanki atribut content_type, razen če bodo res uploadane samo datoteke .doc. Predvidevam tudi, da imaš v podatkovni bazi v tabeli clanki atribut datoteka tipa BLOB, če ne ga nastavi.
Tako bi naj v grobem zgledal del kode servleta:
Mislim, da bi v osnovi po tem principu moralo delovati, res pa je, da že precej časa nisem pisal klasičnih java servletov. Zadnje čase večinoma uporabljam Spring framework.
Mogoče za v pomoč še primer, kako bi to zgledalo v springu.
Kontroler:
DAO
Tako bi naj v grobem zgledal del kode servleta:
//ta del bi naj znal //doGet oz doPost metoda //pridobiš id, ki si ga poslal na servlet //Get vnosa iz baze... Blob blob = rs.getBlob("datoteka"); //iz resultSet-a getam blob String naslov = rs. getString("naslov"); InputStream is = blob.getBinaryStream(); /* nastavim content_type za word datoteke. v primeru, da si boš shranjeval content_type posamezne datoteke v bazo boš tukaj setal string, ki ga boš pobral iz baze */ response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); //nastavim response header in filename response.setHeader("Content-Disposition", "attachment; filename=" + naslov); //InputStream kopiram na response OutputStream IOUtils.copy(is, response.getOutputStream()); //Ne pozabit flush-at buffer response.flushBuffer();
Mislim, da bi v osnovi po tem principu moralo delovati, res pa je, da že precej časa nisem pisal klasičnih java servletov. Zadnje čase večinoma uporabljam Spring framework.
Mogoče za v pomoč še primer, kako bi to zgledalo v springu.
Kontroler:
@RequestMapping(value="/download/{id}", method = RequestMethod.GET) public void downloadFile(@PathVariable("id") int id, HttpServletRequest req, HttpServletResponse res) throws IOException{ try { Priloga priloga = projektService.getPrilogaById(id); InputStream is = priloga.getDatoteka().getBinaryStream(); res.setContentType(priloga.getContent_type()); res.setHeader("Content-Disposition", "attachment; filename=" + priloga.getNaziv()); IOUtils.copy(is, res.getOutputStream()); } catch (SQLException e) { } catch (IllegalStateException il){ } finally{ res.flushBuffer(); } }
DAO
public Priloga getPrilogaById(int id) { String sql = "SELECT * from priloga WHERE id=?"; Priloga priloga = getJdbcTemplate().queryForObject(sql, new Object[]{id }, new BeanPropertyRowMapper<Priloga>(Priloga.class)); return priloga; }
snooze77 ::
Hvala za odgovor...V bazo morem shranjevat zato, ker je to del ene projektne naloge...in bomo morali za zagovor cel projekt dat na šolski strežnik in nimam pravic za zapisovanje na njihov strežnik=)
Drugače sem pa včeraj tudi sam pozno zvečer našel rešitev je zelo podobna tvoji Greg91. Pozabil sem dodati ContentType in Header, ko sem to dodal pa je delovalo.
Še enkrat hvala za pomoč!
Lp
Drugače sem pa včeraj tudi sam pozno zvečer našel rešitev je zelo podobna tvoji Greg91. Pozabil sem dodati ContentType in Header, ko sem to dodal pa je delovalo.
Še enkrat hvala za pomoč!
Lp
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [JAVA] HTTPS clientOddelek: Programiranje | 3185 (1915) | peterv6i |
» | [android] java.lang.RuntimeExceptionOddelek: Programiranje | 1085 (777) | piki12 |
» | java v javascript?Oddelek: Programiranje | 2068 (1771) | boss-tech |
» | [Java] servlet - kako upload-at iz klienta v servletOddelek: Programiranje | 1739 (1645) | Fizikalko |
» | tomcat - problem z encodingomOddelek: Programiranje | 2350 (2264) | kopernik |