Olá.
Estou com um probleminha em minha aplicação que nem 3 dias de busca no Google resolveram. =/
A página que recebe o form de arquivos faz uma consulta no banco de dados e pega o nome do diretório de lá do banco.
Daí então salva os arquivos lá.
Bom, era pra ser assim, mas gera a seguinte mensagem de excessão:
Não foi possível criar o evento
java.sql.SQLException: Illegal operation on empty result set.
Segue o código abaixo:
<%@ 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");
Conexao c = new Conexao();
Connection conn = null;
conn = c.getConection();
try {
Statement st = conn.createStatement();
String sql = "SELECT date_format(EndDiretorio, '%d-%m-%Y_%H-%i-%s') as data " +
" FROM tableTopic Where codTopic ='"+ diretorio+"'";
ResultSet rs = st.executeQuery(sql);
rs.next();
String contentType = request.getContentType();
File dir = new File(application.getRealPath("/") + "/eventos/"+ rs.getString("data"));
if ((contentType != null) && (contentType.indexOf("multipart/form-data") >= 0)) {
DataInputStream in = new DataInputStream(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);
} else {
out.println("erro ao enviar imagens para o diretório!");
}
} catch( SQLException sqlex) {
out.println("Não foi possível criar o evento<br>" +sqlex);
}
%>
Só estou postando aqui porque não cnsegui resolver mesmo. ::)
Por favor, uma ajudinha é bem vinda. ;)
[]s
ok... vamos por partes...
me mostre um exemplo de resultado desta querry sql.
String sql = "SELECT date_format(EndDiretorio, '%d-%m-%Y_%H-%i-%s') as data " +
" FROM tableTopic Where codTopic ='"+ diretorio+"'";
ou seja... vá o mysql e faça essa querry com os dados e me mostre seu exemplo e o resultado da busca do exemplo.
se der mostre tambem como vc faz o banco de dados...
seus create tables da vida... geralmente vc os guarda em um txt... não?
e vamo lá...
Opa, olá Reeves.
Respondendo à sua pergunta: sim, guardo em txt, ou melhor, em extensão 'sql' mesmo.
Bom, vamos lá:
Quote####### tabela para tópicos #######
create table tableTopic (codTopic integer(100) not null primary key auto_increment,
codDiretorio varchar(100) default '0',
titleTopic varchar(25) not null,
conteudoTopic text(1000) not null, EndDiretorio DATETIME);
######################################
Bom, meus selects e inserts geralmente são como os abaico.
Segue a página antes daquela que informei no início do tópico:
<%@page language="java" import="schema.Conexao"%>
<%@page contentType="text/html;charset=ISO-8859-1"%>
<%@page import="java.sql.*"%>
<%@page import="java.io.*"%>
<%@page import="java.util.Date"%>
<%
// session.getAttribute("adm001");
String titleEvento = request.getParameter("titleTopic");
String conteudoEvento = request.getParameter("richEdit0"); // editor de textos
if (titleEvento == null || titleEvento == "") {
response.sendRedirect("new-evento.jsp?TituloVazio");
return;
}
if (titleEvento.equals ("'")) {
response.sendRedirect("new-evento.jsp?ConteudoVazio");
}
Conexao c = new Conexao();
Connection conn = c.getConection();
try {
PreparedStatement pstmt = conn.prepareStatement("SELECT count(*) as topicos FROM tableTopic");
ResultSet rs = pstmt.executeQuery();
rs.next();
int topico = Integer.parseInt(rs.getString("topicos"));
int diretorio = topico+1;
Statement stmt = conn.createStatement();
stmt.execute("INSERT INTO tableTopic (codDiretorio, titleTopic, conteudoTopic, "+
" EndDiretorio) VALUES ("+diretorio+", '"+titleEvento+"', '"+conteudoEvento+
"', now() )");// WHERE adm001 == '"+adm001+"');");
PreparedStatement pstmt1 = conn.prepareStatement(
"SELECT date_format(EndDiretorio, '%d-%m-%Y_%H-%i-%s') as data FROM tableTopic "+
" WHERE codDiretorio='"+diretorio+"' and titleTopic = '"+titleEvento+"'");
ResultSet rs1 = pstmt1.executeQuery();
rs1.next();
File dir = new File(application.getRealPath("/") + "/eventos/"+ rs1.getString("data"));
if (dir.mkdir()) {
response.sendRedirect("galery.jsp?ok="+diretorio);
//out.println("Tópico criado com sucesso!<br>Próximo passo: enviar imagens");
rs1.close();
conn.close();
} else {
out.println("erro ao criar diretório!");
}
} catch(SQLException sqlex) {
out.println("Não foi possível criar o evento<br>" +sqlex);
// session.putValue("erroCreate", "Nao foi possível criar o evento!");
// response.sendRedirect("new-evento.jsp?erro");
}
%>
* Select para buscar o nome do diretório:
(http://i70.servimg.com/u/f70/11/80/81/44/query10.gif)
* Formatei e retirei os
'dois pontos' do nome e modifiquei por traços mesmo, pois diretórios não aceitam estes caractes como tal.
Esta página cria o diretório e depois redireciona para a que foi citada no começo do tópico (upload das imagens do referente tópico).
Bom, já criei um servlet e tudo mais que faz tudo o que estava procurando.
O único problema agora é que no IE, as imagens são enviadas com a url de origem (c:/documents and settings...) e no Mozilla, apenas o nome do arquivo (arquivo.jpg).
O servlet é esse aqui:
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);
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>
}
O trecho é esse aqui:
QuoteString itemName = item.getName();
File savedFile = new File(getServletContext().getRealPath("/")+"eventos/"+itemName);
item.write(savedFile);
desculpe minha falta de tempo
mas explique melhor seu problema atual ai!
vlw.
Vou explicar melhor:
O problema atual é que quando os arquivos são enviados utilizando o Internet Explorer, o endereço de origem (do computador que vem o arquivo) é inserido junto com o nome do arquivo. Já no Mozilla, o upload é realizado com sucesso.
Exceção no IE:
Quotejava.io.FileNotFoundException:
C:\Arquivos de programas\Apache Software Foundation\Tomcat 6.0\
webapps\comandosom\eventos\C:\Documents and Settings\TriploX\
Desktop\banner copy.gif (A sintaxe do nome do arquivo,
pasta ou nome do volume está incorreta)
Bom, quando eu estava utilizando uma simples página em JSP, só acontecia
isso no servidor e não no server local, mas já que é um servlet, o mesmo
problema acontece em ambos servers.
Até tentei resolver com a linha:
QuoteString itemName = item.getName().substring(item.getName().lastIndexOf("/"));
Ficando assim:
Quote
try {
// String itemName = item.getName();
String itemName = item.getName().substring(item.getName().lastIndexOf("/"));
File savedFile = new File(getServletContext().getRealPath("/")+"eventos/"+itemName);
item.write(savedFile);
mas gera a exceção:
Quotejava.lang.StringIndexOutOfBoundsException: String index out of range: -1
Desculpem-me a pergunta de iniciante, mas é que fazem apenas 2 dias que tento iniciar em servlets.
Obrigado.
ae Triplo X
se esse topico chegou a alguma conclusão... responda com a experiencia adiquirida para eu colocar [Concluido]
:D
QuoteBom, da maneira como eu queria, só consegui concluir ontém (21/02/09).
Até tentei concluir este tópico, mas minha net deixa a desejar -.-
Vamos ao que interessa:
Este não é apenas um upload simples em JSP, se fosse assim eu não teria criado este tópico.
Um upload capturando parâmetros é divercificado: pode ser usado para inserir o caminho da imagem em um banco de dados, o tamanho do arquivo ou neste caso, recuperar um nome de um diretório e inserir uma imagem em um local específico.
Neste novo exemplo, a imagem será enviada para um diretório específico, criado antes de enviar o arquivo.
Segue o código comentado:
<%@page import="database.Conexao"%> <!--class JAVA de conexão -->
<%@page import="java.sql.*"%>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Iterator" %>
<%@ page import="java.io.File" %>
<!-- imports para realizar o upload -->
<%@ page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%>
<%@ page import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%>
<%@ page import="org.apache.commons.fileupload.*"%>
<%@ page import="org.apache.commons.fileupload.FileItem" %>
<%@ page contentType="text/html;charset=ISO-8859-1" language="java" %>
<% // testa se o administrador está logado para enviar o arquivo
String admin = (String) session.getAttribute("administrador");
if (admin == null) {
response.sendRedirect("./login.jsp");
} else {
String emp_name=""; // cria a variável responsável para capturar o parâmetro logo abaixo
int count1=0; // caso fossem vários parâmetros para upload, seria assim: int count1 = 0, count2 = 0; ...
Connection conn = Conexao.getConection(); // recupera a conexão com o banco de dados
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// a partir daqui é o upload *******
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (!isMultipart) {
out.println("Não foi possível fazer requisição!");
} 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("pasta")) { // valor do parâmetro
emp_name=value;
count1=1;
}
} else {
// este select serve para resgatar um diretório que possui seu nome salvo em um banco de dados...
pstmt = conn.prepareStatement("SELECT * FROM galeriasapae WHERE titgaleria = ?");
pstmt.setObject(1, emp_name);
rs = pstmt.executeQuery();
rs.next();
try {
String itemName = (new File(item.getName()).getName()); // aqui é necessário para ser enviado utilizando o Int. Explorer
String valor = item.getFieldName();
File savedFile = new File(application.getRealPath("/")+"upload/galerias/"+emp_name+"/"+(new File(item.getName()).getName()));
item.write(savedFile); // upload realizado
pstmt = conn.prepareStatement("INSERT INTO urlimage (caminho) VALUES (?)");
pstmt.setObject(1, itemName);
pstmt.execute(); // nome da imagem enviado para um banco de dados
// Sessão criada para dizer que upload foi enviado
request.getSession().setAttribute("uploadok", "<div style='padding-left:35px;padding-top:15px;padding-right:35px;'><div style='padding-top:15px;padding-left:5px;padding-bottom:15px;border:dashed;border-width:1px;color:blue;'>Imagem enviada com sucesso!</div></div>");
response.sendRedirect("./?gf&sid="+rs.getString("idgaleria")); // redireciona para o diretório específico
} catch (Exception e) {
// e.printStackTrace();
// out.println("Erro ao enviar imagem!<br>"+e); // utilizado apenas para testes
request.getSession().setAttribute("erroupload", "<div style='padding-left:35px;padding-top:15px;padding-right:35px;'><div style='padding-top:15px;padding-left:5px;padding-bottom:15px;border:dashed;border-width:1px;color:red;'>Erro ao enviar imagem!</div></div>");
response.sendRedirect("./?gf&sid="+rs.getString("idgaleria")); // criou sessão de erro e redirecionando para a página de upload
}
}
}
}
// aqui é necessário, caso tentem burlar o link de upload, fazendo com que o sistema não capture parâmetros...
rs.close(); } catch (SQLException sqlex) { out.println("Não foi possível redirecionar..."); }
} // fim do teste de sessão do administrador %>
Bom, não é difícil transformar este scriplet em um servlet, então deixo isso com vocês!
[]s