# Servlet zum speichern einer Datei in einer Datenbank



## eolith421 (28. Jul 2010)

Hallo!
Ich versuche derzeit gerade ein Servlet zu schreiben welches von einer GWT Anwendung eine Datei entgegen nimmt und diese in einer Datenabnk speichert. Ich habe das Servlet ausd verschiedenen Quellen aus dem Internet zusammengebastelt und es funktioniert auch in der Entwicklungsumgebung. Alelrdings hat das Servlet noch einen Fehler: Die Datei wird zunächst im Dateisystem gespeichert und erst dann in der DB. Das will ich aber nicht, die Datei soll gleich in der DB gespeichert werden.

Was muss ich dafür ändern? Hier ist der Quellcode:


```
public class ImageUpload extends HttpServlet {
	
	private static final long serialVersionUID = -5938868593144607557L;
	private Logger log = Logger.getLogger(ImageUpload.class);
	private FileInputStream inputStream;
	private String content_type = null;
		
	@SuppressWarnings("unchecked")
	public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		log.debug("service has been called");
		
		if(!ServletFileUpload.isMultipartContent(request))
			return;
		
		FileItemFactory factory = new DiskFileItemFactory();
		ServletFileUpload servletUpload = new ServletFileUpload(factory);
		
		List fileItems = null;
		try {
			fileItems = servletUpload.parseRequest(request);
		}
		catch(FileUploadException e){
			log.error(e);
			return;
		}
		
		for(java.util.Iterator i = fileItems.iterator(); i.hasNext();){
			
			FileItem item = (FileItem) i.next();
			
			if(item.isFormField())
				continue;
			
			String fileName = item.getName();
			
			int slash = fileName.lastIndexOf("/");
			if(slash == -1){
				slash = fileName.lastIndexOf("\\");
			}
			if(slash != -1) {
				fileName = fileName.substring(slash+1);
			}
			
			try {
				
				int galleryId = -1; 
				galleryId = Integer.parseInt(request.getParameter("galleryId"));
				log.debug("Gallery ID: "+galleryId);
				
				if(galleryId != -1){
					
					Gallery temp = new Gallery();
	                temp.setPID(galleryId);
	                Gallery gallery = new Gallery(temp);
	                log.debug("Gallery Name: "+gallery.getName());
					
					content_type = item.getContentType();
					
	                File uploadedFile = new File(fileName);
	                item.write(uploadedFile);
	                
	                inputStream = new FileInputStream(uploadedFile);
	               
	                byte[] b = new byte[(int) uploadedFile.length()];
	                
	                inputStream.read(b);

	                JImage image = new JImage();
	                image.setCreationDate(new Date());
	                image.setDeleted(false);
	                image.setImageTyp(content_type);
	                image.setName(fileName);
	                image.setSubtitle("");
	                image.setGallery(gallery);
	                image.setViews(0);
	                image.setImage(b);
	                
	                image.addImage();
	                
	                gallery.getImages().add(image);
	                gallery.update();
	                
	                response.setContentType("text/html");
	                response.getWriter().print(image.getPID());
				}
			}
			catch (Exception e) {
				log.error(e);
			}
		}
	}

}
```

Vielen Dank für eure Hilfe, wäre super wenn ihr mir helft!

Florian


----------



## ARadauer (28. Jul 2010)

das FileItem ist das von apache commons... hohl dir von dem objekt den inputstream und schreibe es mit einem bytearrayoutputstream in ein byte[]


```
InputStreamReader in =   new InputStreamReader(item.getInputStream());
               	ByteArrayOutputStream bos = new ByteArrayOutputStream();
            	int c;
            	while ((c = in.read()) != -1) {
            		bos.write((byte) c);
            	}
            	
            	byte[] b = bos.toByteArray();
```
versuch das mal... falls es nicht klappt, hab ich funktionierenden Code in der Firma, den kann ich dir morgen posten


----------



## ARadauer (29. Jul 2010)

ok wie sieht der code hier in der firma aus... 
ich verwende da IOUtils von Apache Commons... das würd ich mir runter laden..
ein auszug daraus:


```
private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;
public static byte[] toByteArray(InputStream input) throws IOException {
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        copy(input, output);
        return output.toByteArray();
    }
 public static int copy(InputStream input, OutputStream output) throws IOException {
        long count = copyLarge(input, output);
        if (count > Integer.MAX_VALUE) {
            return -1;
        }
        return (int) count;
    }
public static long copyLarge(InputStream input, OutputStream output)
            throws IOException {
        byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
        long count = 0;
        int n = 0;
        while (-1 != (n = input.read(buffer))) {
            output.write(buffer, 0, n);
            count += n;
        }
        return count;
    }
```


----------



## eolith421 (4. Aug 2010)

Hallo!
Tut mir leid, dass ich erst jetzt antworte! Ich wollte mich bei dir herzlich bedanken, deine Codeschnipsel haben wunderbar funktioniert das Servlet läuft jetzt 1A! Damit alle davon etwa haben werde ich im folgenden den wichtigsten Teil des Codes online stellen. Wenn jemand interesse am kompletten Code hat, einfach melden!


```
.
.
.
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		log.debug("imageUpload has been called");
		
		if(!ServletFileUpload.isMultipartContent(request))
			return;
		
		FileItemFactory factory = new DiskFileItemFactory();
		ServletFileUpload servletUpload = new ServletFileUpload(factory);
		
		List fileItems = null;
		try {
			fileItems = servletUpload.parseRequest(request);
		}
		catch(FileUploadException e){
			log.error(e);
			return;
		}
		
		InputStream in;
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		
		for(java.util.Iterator i = fileItems.iterator(); i.hasNext();){
			
			FileItem item = (FileItem) i.next();
			
			if(item.isFormField())
				continue;
			
			String fileName = item.getName();
			
			int slash = fileName.lastIndexOf("/");
			if(slash == -1){
				slash = fileName.lastIndexOf("\\");
			}
			if(slash != -1) {
				fileName = fileName.substring(slash+1);
			}
			
			try {
				
				int galleryId = -1; 
				galleryId = Integer.parseInt(request.getParameter("galleryId"));
				log.debug("Gallery ID: "+galleryId);
				
				if(galleryId != -1){
					
					Gallery temp = new Gallery();
	                temp.setPID(galleryId);
	                Gallery gallery = new Gallery(temp);
	                log.debug("Gallery Name: "+gallery.getName());
					
					content_type = item.getContentType();
					
					in =   item.getInputStream();
					out = new ByteArrayOutputStream();
					
					// this method (copy) is defined beneath the current method
					copy(in, out);
					
					byte[] b = out.toByteArray();

	                JImage image = new JImage();
	                image.setCreationDate(new Date());
	                image.setDeleted(false);
	                image.setImageTyp(content_type);
	                image.setName(fileName);
	                image.setSubtitle("");
	                image.setGallery(gallery);
	                image.setViews(0);
	                image.setImageFile(b);
	                
	                image.addImage();
	                
	                gallery.getImages().add(image);
	                gallery.update();
	                
	                response.setContentType("text/html");
	                response.getWriter().print(image.getPID());
				}
			}
			catch (Exception e) {
				log.error(e);
			}
		}
	}
	
	private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;
	private static int copy(InputStream input, OutputStream output) throws IOException {
        long count = copyLarge(input, output);
        if (count > Integer.MAX_VALUE) {
            return -1;
        }
        return (int) count;
	}
	private static long copyLarge(InputStream input, OutputStream output)
    throws IOException {
		byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
        long count = 0;
        int n = 0;
        while (-1 != (n = input.read(buffer))) {
            output.write(buffer, 0, n);
            count += n;
        }
        return count;
	}
.
.
.
```

Liebe Grüße,
Florian


----------

