Пересылать файл в сервер Java ee

Превосходное сообщество! :) Я приношу им консультацию. Я стараюсь делать формуляр с Java, который получает текст, дату и файл. Файл переслан в сервер, получает соединение файла, и это хранит в базе данных.

Сначала он сделал часть, в которой он пересылает дату и текст в базу данных, сейчас я пробую добавлять часть, в которой зазнается файл в сервер, и по какому-то разуму я не удаюсь, сделав это.

Здесь мой код:

Формуляр:

<%@page contentType="text/html" pageEncoding="UTF-8"%>

<%
    String usuario = "";
    HttpSession sesionOk = request.getSession();
    if (sesionOk.getAttribute("usuario") == null) { //Verifica que este logueado
    %>
        
    <%
    } else {
        usuario = (String)sesionOk.getAttribute("usuario");
    }
%>


    
        

        

        
        Legislatura Pro Cordoba Sur
    

    

            
MENU -> <%=usuario%> - Cerrar Sesion
" method="POST">
Fecha:
Texto:
Agregar adjunto



${requestScope.error}
Pro Cordoba Sur - 2016

Servlet:

import com.mysql.jdbc.Connection;
import java.io.File;
import java.io.IOException;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.http.Part;

/**
 *
 * @author Facu
 */
@WebServlet(urlPatterns = {"/agregarComentarioServlet"})
@MultipartConfig(fileSizeThreshold=1024*1024*10,    // 10 MB 
                 maxFileSize=1024*1024*50,          // 50 MB
                 maxRequestSize=1024*1024*100)      // 100 MB
public class agregarComentarioServlet extends HttpServlet {
    private static final String UPLOAD_DIR = "archivos";
    Connection connection;

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        HttpSession sesionOk = request.getSession();

        if ( (sesionOk.getAttribute("usuario") == null) ){//Verifica que este logueado
            request.getRequestDispatcher("login.jsp").forward(request, response);
        }

        if(request.getParameter("codigo")==null){
            String error="
Intentando agregar un comentario sin codigo
"; request.setAttribute("error", error); request.getRequestDispatcher("menuServlet").forward(request, response); } try { connectDB(); } catch (SQLException ex) { String error="
Error al conectar con la base de datos
"; request.setAttribute("error", error); request.getRequestDispatcher("menu.jsp").forward(request, response); } catch (ClassNotFoundException ex) { String error="
Driver no cargado
"; request.setAttribute("error", error); request.getRequestDispatcher("menu.jsp").forward(request, response); } subirArchivo(request, response); PreparedStatement preparedStmt=null; try { String sql="INSERT INTO comentario (fecha, codigo, texto) VALUES (?,?,?)"; String fecha= request.getParameter("fecha"); String codigoStr=request.getParameter("codigo"); int codigo=Integer.parseUnsignedInt(codigoStr); String texto=request.getParameter("texto"); preparedStmt = connection.prepareStatement(sql); preparedStmt.setString(1, fecha); preparedStmt.setInt(2, codigo); preparedStmt.setString(3, texto); preparedStmt.execute(); request.getRequestDispatcher("editarServlet?codigo="+codigo).forward(request, response); } catch (SQLException ex) { String error="
La consulta es incorrecta
"; request.setAttribute("error", error); request.getRequestDispatcher("menu.jsp").forward(request, response); }catch (NumberFormatException ex){ String error="
El estado es invalido
"; request.setAttribute("error", error); request.getRequestDispatcher("menuServlet").forward(request, response); }finally{ try { if (preparedStmt != null) preparedStmt.close(); } catch (Exception e) {}; try { if (connection != null) connection.close(); } catch (Exception e) {}; } } void connectDB() throws SQLException, ClassNotFoundException{ Class.forName("com.mysql.jdbc.Driver"); //Carga el driver String url = "jdbc:mysql://127.0.0.1:3306/expediente"; String username = "root"; String password = "123456"; connection = (Connection) DriverManager.getConnection(url, username, password); } String subirArchivo(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ try { // gets absolute path of the web application String applicationPath = request.getServletContext().getRealPath(""); // constructs path of the directory to save uploaded file String uploadFilePath = applicationPath + File.separator + UPLOAD_DIR; // creates the save directory if it does not exists File fileSaveDir = new File(uploadFilePath); if (!fileSaveDir.exists()) { fileSaveDir.mkdirs(); } String fileName = null; //Get all the parts from request and write it to the file on server for (Part part : request.getParts()) { fileName = (String) getFileName(part); part.write(uploadFilePath + File.separator + fileName); } return fileName; } catch (IOException | ServletException ex) { String error="
Error al subir el archivo
"; request.setAttribute("error", error); request.getRequestDispatcher("menu.jsp").forward(request, response); } return ""; } private String getFileName(Part part) { String contentDisp = part.getHeader("content-disposition"); String[] tokens = contentDisp.split(";"); for (String token : tokens) { if (token.trim().startsWith("filename")) { return token.substring(token.indexOf("=") + 2, token.length()-1); } } return ""; } // /** * Handles the HTTP GET method. * * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } /** * Handles the HTTP POST method. * * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } }

И здесь ошибка, которая отпускает меня:

java.lang.IllegalStateException: No puedo reenviar después de que la respuesta se haya llevado a cabo.
    agregarComentarioServlet.processRequest(agregarComentarioServlet.java:73)
    agregarComentarioServlet.doPost(agregarComentarioServlet.java:168)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

Я довожу до сведения, что часть пересылания файла в server не является моей, правдой в том, что у него не было даже идеи, как делание этого, asique ведите меня с этим руководителем: http://www.journaldev.com/2122/servlet-3-file-upload-multipartconfig-part

Так или иначе он не объясняет хорошо, как оно функционирует, и я не понял многий того, что я сделал (там причина того, что он не удается:/), если кто-то может объяснять мне и помогать исправлять ошибку, ему был бы благодарен Asique за это muchooo.


Обновление:

Продолжая эту помощь: https://stackoverflow.com / questions / 2422468/how-to-upload-files-to-server-using-jsp-servlet

Мне удалось переслать файл в сервер. Здесь код:

String subirArchivo(int codigo, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
    Part filePart = request.getPart("archivo"); // Obtiene el archivo
    String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.

    //InputStream fileContent = filePart.getInputStream(); //Lo transforma en InputStream

    String path="/archivos/";
    File uploads = new File(path); //Carpeta donde se guardan los archivos
    uploads.mkdirs(); //Crea los directorios necesarios
    File file = File.createTempFile("cod"+codigo+"-", "-"+fileName, uploads); //Evita que hayan dos archivos con el mismo nombre

    try (InputStream input = filePart.getInputStream()){
        Files.copy(input, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
    }

    return file.getPath();
}

Однако, у меня есть проблемы относительно расположения, где сохраняют файл... Если в String path, я размещаю "/файлы /", файл переслан в C://файлы Следовательно мне невозможно загружать это, так как tomcat он не соглашается на вышеупомянутый каталог (я не объясняюсь, как он состоит в том, что он делает, чтобы это пересылать там...), я Пробую загружаться: http://localhost:8080/archivos/comentario.csv И он говорит мне, что ресурс не доступен.

Если наоборот, в path я размещаю относительный каталог: "./archivos /" Файл переслан в каталог bin внутри моей папки tomcat. И также я не могу соглашаться, чтобы это загружать. Как он был бы должен делать, чтобы это пересылать в папку, к которой он имел бы доступ?

0
задан 23.05.2017, 15:39
2 ответа

Я нашел решение в: https://stackoverflow.com / questions / 2422468/how-to-upload-files-to-server-using-jsp-servlet

у Меня остался следующий код:

String subirArchivo(int codigo, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
    Part filePart = request.getPart("archivo"); // Obtiene el archivo
    String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.

    //InputStream fileContent = filePart.getInputStream(); //Lo transforma en InputStream

    String path="/archivos/";
    File uploads = new File(path); //Carpeta donde se guardan los archivos
    uploads.mkdirs(); //Crea los directorios necesarios
    File file = File.createTempFile("cod"+codigo+"-", "-"+fileName, uploads); //Evita que hayan dos archivos con el mismo nombre

    try (InputStream input = filePart.getInputStream()){
        Files.copy(input, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
    }

    return file.getPath();
}

Файл переслан в C:\archivos. А следовательно необходимо добавлять:

<Context docBase="C:\archivos" path="/archivos" />

в файл server.xml конфигурации tomcat, внутри этикетки <host>

2
ответ дан 24.11.2019, 13:04

Определяет полный маршрут direcciГіn, где сохранять / файлы

, Эдж:

directorio=C:/temp/informes 

Важно, что ты считал этот каталог созданным в sevidor

Потом в Java сноп:

File miArchivo = new File(directorio, nombreArchivo);

Потом с твоим файлом, обращенным в байт [] ты можешь делать:

FileOutputStream zos = null;
        try {
            zos = new FileOutputStream(miArchivo);
        ByteArrayInputStream bais = null;
        try {
            bais = new ByteArrayInputStream(miArchivoByteArray);
            byte[] buffer = new byte[2048];
            int leido = 0;
            while (0 < (leido = bais.read(buffer))) {
                zos.write(buffer, 0, leido);
            }

        } catch (IOException ex) {
            //salida de error
        } finally {
            bais.close();
            zos.close();
        }

И тогда сторож в базе данных path и имя

ej:

miArchivo.getAbsolutePath();//ej C:\temp\informes\nombreArchivo
miArchivo.getName();//nombreArchivo

AhГ - у тебя есть имена каждого случая, ты можешь пересылать их и обрабатывать информацию с Java, BBDD или то, чего он касается ;) (раньше или despuГ©s try, этого в твой вкус и segГєn предпочти)

0
ответ дан 24.11.2019, 13:04