» »

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

  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 ()

vorantz ::

zakaj pa daješ file direkt v bazo? :|
shrani nekam in v bazo zapišeš pot do fajla

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:
//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


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[JAVA] HTTPS client

Oddelek: Programiranje
173185 (1915) peterv6i
»

[android] java.lang.RuntimeException

Oddelek: Programiranje
141085 (777) piki12
»

java v javascript?

Oddelek: Programiranje
212068 (1771) boss-tech
»

[Java] servlet - kako upload-at iz klienta v servlet

Oddelek: Programiranje
141739 (1645) Fizikalko
»

tomcat - problem z encodingom

Oddelek: Programiranje
72350 (2264) kopernik

Več podobnih tem