Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Dark Tranquility

Upload de vários arquivos criando diretório

Recommended Posts

Olá a todos.

 

Sou novo aqui e já venho com um probleminha em JSP com uploads.

 

Tento pegar o nome do diretório (que é a data) de dentro de uma consulta do banco de dados mas dá operação ilegal.

 

Faço isso, pois uma página anterior à essa que trata a imagem é preenchida antes e depois é tratada e insere dados, os quais são retornados nesta página.

 

Enfim, tento enviar a imagem para o diretório que seu nome lógico foi criado no banco.

 

<%@page language="java" import="schema.Conexao"%>
<%@page contentType="text/html" pageEncoding="iso-8859-1"%>
<%@ page import="java.io.*"%>
<%@ page import="java.util.*"%>
<%@page import="java.sql.*"%>

<%

 String diretorio = request.getParameter("ok");

   try {

		 String contentType = request.getContentType();

		 Connection conn = new Conexao().getConection();

		 String query =
		 "SELECT date_format(EndDiretorio, '%d-%m-%Y_%H-%i-%s') as data FROM tableTopic WHERE codDiretorio = ? ";
		 PreparedStatement pstmt = conn.prepareStatement(query);
		 pstmt.setObject(1, diretorio);

		 ResultSet rs = pstmt.executeQuery();
		 rs.next();

		 out.println(rs.getString("data"));

		 // Evite criar instâncias de File utilizando "/" ou "\\" procure fazer assim:
		 File dir = new File(application.getRealPath("/") + "eventos/");
			  dir = new File(dir, rs.getString("data"));
			  dir = new File(dir, "logo");

		 // utilize o mkdirs para criar a estrutura de diretórios completa
		 if (dir.mkdir()) {
			if ((contentType != null) && (contentType.indexOf("multipart/form-data") >= 0)) {
			   InputStream in = request.getInputStream();

			   int formDataLength = request.getContentLength();
			   byte dataBytes[] = new byte[formDataLength];
			   int byteRead = 0;
			   int totalBytesRead = 0;
			   while (totalBytesRead < formDataLength) {
				  byteRead = in.read(dataBytes, totalBytesRead, formDataLength);
				  totalBytesRead += byteRead;
			   }

			   String file = new String(dataBytes);
			   String saveFile = file.substring(file.indexOf("filename=\"") + 10);
			   saveFile = saveFile.substring(0, saveFile.indexOf("\n"));
			   saveFile = saveFile.substring(saveFile.lastIndexOf("\\") + 1, saveFile.indexOf("\""));

			   int lastIndex = contentType.lastIndexOf("=");
			   String boundary = contentType.substring(lastIndex + 1, contentType.length());

			   int pos;
			   pos = file.indexOf("filename=\"");
			   pos = file.indexOf("\n", pos) + 1;
			   pos = file.indexOf("\n", pos) + 1;
			   pos = file.indexOf("\n", pos) + 1;

			   int boundaryLocation = file.indexOf(boundary, pos) - 4;
			   int startPos = ((file.substring(0, pos)).getBytes()).length;
			   int endPos = ((file.substring(0, boundaryLocation)).getBytes()).length;

			   String filepath = dir + "/" + saveFile;

			   FileOutputStream fileOut = new FileOutputStream(filepath);
			   fileOut.write(dataBytes, startPos, (endPos - startPos));
			   fileOut.flush();
			   fileOut.close();

			   out.println("diretório criado e imagens enviadas para<br>" + filepath);

			 //  out.println("<img src=\"eventos/" +filePath+ "\" / >");

			} else {
			   out.println("erro ao enviar imagens para o diretório!");
			}
		 } else {
			out.println("erro ao criar diretório!");
		 }
	  } catch (SQLException sqlex) {
		 out.println("Não foi possível criar o evento<br>" + sqlex);
	  }

 %>

 

Excessão: Não foi possível criar o evento

java.sql.SQLException: Illegal operation on empty result set.

 

Isso acontece justo no momento de pegar o nome do diretório... =/

 

Alguma ajudinha ?

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

O seu problema está no comando SQL. Verifique este trecho do seu código:

String query =
		 "SELECT date_format(EndDiretorio, '%d-%m-%Y_%H-%i-%s') as data FROM tableTopic WHERE codDiretorio = ? ";
		 PreparedStatement pstmt = conn.prepareStatement(query);
		 pstmt.setObject(1, diretorio);

		 ResultSet rs = pstmt.executeQuery();
		 rs.next();

A sua consulta não está retornando linhas. O método next de ResultSet retorna um tipo boolean: verdadeiro se o ponteiro passar para próxima linha e falso caso não seja possível ir para próxima linha ou não tenha mais linha. Como o seu ResultSet está vazio, não há como utilizar

out.println(rs.getString("data"));
. A excessão está nesta parte. Sempre quando for percorrer um ResultSet, faça-o dentro de um loop. Ex.:
while(rs.next) { out.println("data"); }

Uma dica pra você. Não utilize mais scriptlets. Pesquise sobre MVC e frameworks que dêm suporte, como Struts, JSF...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, obrigado a todos.

 

Mas agora que criei um servlet pra fazer isso pra mim, o problema agora é que no Mozilla envia normalmente, mas no IE vai o caminho do pc do usuário junto com o nome da imagem, possibilitando erro no upload.

 

Encontrei o exemplo em JSP e fiz um servlet.

 

Origem: http://www.roseindia.net/jsp/file_upload/e...ile_image.shtml

 

Também fui na FAQ do commons e encontrei isto: http://commons.apache.org/fileupload/faq.h...le-path-from-IE

Mas não ajudou, pois a variável Filename.Utils não existe e config também não, então não deu certo.

 

 

segue o servlet:

 

package uploader;

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import schema.Conexao;
import java.sql.*;

public class createGallery extends HttpServlet {
	private String id = "";	
	private int count1 = 0;
   
	protected void processRequest(HttpServletRequest request, HttpServletResponse response)
	throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
			 
	   // int count1 = 0;
	   
		boolean isMultipart = ServletFileUpload.isMultipartContent(request);
		 if (!isMultipart) {
			   // out.println("Erro ao enviar requisição!"); 
					 
			 if (!ServletFileUpload.isMultipartContent(request)) { 
					 String erro = request.getParameter("ok");
						if (erro != null) {
							response.sendRedirect("galery.jsp?ok="+erro+"&error=yes");
						}
				 }
			 
		 } else {
			 FileItemFactory factory = new DiskFileItemFactory();
			 ServletFileUpload upload = new ServletFileUpload(factory);
			 List items = null;
			 try {
				 items = upload.parseRequest(request);
				 } catch (FileUploadException e) {
				 e.printStackTrace();
				 }
				 Iterator itr = items.iterator();
				 while (itr.hasNext()) 
					 {
				 FileItem item = (FileItem) itr.next();
		
			  if (item.isFormField()) {
				  String name = item.getFieldName();
				  String value = item.getString();
				  if(name.equals("ok")) {
				   id = value;
							  // out.println("A id do tópico é: "+value +"<br><br>");
							   count1 = 1;
					  }
					 } else {
		
					 try {
						 String itemName = item.getName();
						   File savedFile = new File(getServletContext().getRealPath("/")+"eventos\\"+itemName);
						// retirei o "config.getServlet.." pois não existe variável config no servlet nem "application.getServlet..."	
													item.write(savedFile);  
	 
					 if(count1 == 1) {	 
					 Connection conn = Conexao.getConection();
					 
					 int codigo = Integer.parseInt(id);
					 
					 PreparedStatement inserirImagem = conn.prepareStatement(
						 "INSERT INTO images_001 (codigoTopic, url_image) VALUES (?, ?) ");
					  inserirImagem.setInt(1, codigo);
					  inserirImagem.setObject(2, itemName);
					  
					  inserirImagem.execute();
					  
					  //out.println("Imagem gravada no banco de dados com sucesso!");
					  //out.println("Código da página: "+codigo+"<br>A imagem enviada foi: "+itemName);

					  response.sendRedirect("galery.jsp?ok="+codigo+"&sucessfull=yes");
					  
					 }
					  
					 } catch(Exception ex) {
						 //ex.printStackTrace();
						 //out.println(ex);
					  response.sendRedirect("galery.jsp?ok="+id+"&exception=yes");   
					 } 
						 
				 }
			 }
		 } 
	} 

	// <editor-fold defaultstate="collapsed" desc="Métodos HttpServlet. Clique no sinal de + à esquerda para editar o código.">
	/** 
	* Handles the HTTP <code>GET</code> method.
	* @param request servlet request
	* @param response servlet response
	*/
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
	throws ServletException, IOException {
		processRequest(request, response);
	} 

	/** 
	* Handles the HTTP <code>POST</code> method.
	* @param request servlet request
	* @param response servlet response
	*/
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
	throws ServletException, IOException {
		processRequest(request, response);
	}

	/** 
	* Returns a short description of the servlet.
	*/
	@Override
	public String getServletInfo() {
		return "Short description";
	}
	// </editor-fold>
}

 

Desde já, agradeço a todos que participaram.

 

*PS: quase não vi os posts de vocês, pois aparecem apenas os títulos das respostas no fim da página.

 

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.