Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Παίδες έχω κάποια θεματάκια με έναν sample dile Uploader που εχω κάνει σε Java Servlet. Και επειδή χρονιάρες μέρες δεν θέλετε πολύ μπλα μπλά:

 

Το Servlet:

package test;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.OutputStream;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import javax.servlet.*;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.*;

/**
 * Created by pcmagas on 15/3/2015.
 */
@MultipartConfig
public class FileUpload extends HttpServlet
{

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        response.setContentType("text/html;charset=UTF-8");
        response.setCharacterEncoding("UTF-8");

        RequestDispatcher view= request.getRequestDispatcher("./views/upload.jsp");
        view.forward(request,response);
    }


    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        Part file= request.getPart("file");
        String fileName = "uploads"+ File.separator+extractFileName(file);
        String message="";

        boolean status=false;

        OutputStream out=null;
        InputStream fileContent = null;

        try
        {
            out=new FileOutputStream(fileName);
            fileContent = file.getInputStream();

            int read = 0;
            final byte[] bytes = new byte[1024];

            while ((read = fileContent.read(bytes)) != -1)
            {
                out.write(bytes, 0, read);
            }
            status=true;
        }
        catch (FileNotFoundException fne)
        {
            status=false;
            message=fne.getMessage();
        }
        finally
        {
            if(out != null) out.close();
            if(fileContent !=null) fileContent.close();
        }

        response.setContentType("text/html;charset=UTF-8");
        response.setCharacterEncoding("UTF-8");

        request.setAttribute("filename",fileName);
        request.setAttribute("status", status);
        request.setAttribute("message",message);

        RequestDispatcher view= request.getRequestDispatcher("./views/upload_sucess.jsp");
        view.forward(request,response);
    }

    /**
     * Extracts file name from HTTP header content-disposition
     */
    private String extractFileName(Part part) {
        String contentDisp = part.getHeader("content-disposition");
        String[] items = contentDisp.split(";");
        for (String s : items) {
            if (s.trim().startsWith("filename")) {
                return s.substring(s.indexOf("=") + 2, s.length()-1);
            }
        }
        return "";
    }
}

Το upload.jsp

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8"/>
    <title>File Uploader</title>
</head>
<body>
    <h1>Upload a file</h1>
    <form method="POST" enctype='multipart/form-data' action="./files">
       File:<input type="file" name="file"/><br>
       <input type="submit" value="Upload">
    </form>
</body>
</html>

Και το upload_sucess.jsp

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8"/>
    <title>File Uploader</title>
</head>
<body>
    <h1>Upload a file</h1>
    <form method="POST" enctype='multipart/form-data' action="./files">
       File:<input type="file" name="file"/><br>
       <input type="submit" value="Upload">
    </form>
    <%
       Boolean status=(Boolean)request.getAttribute("status");
       String filename=(String)request.getAttribute("filename");
       String message=(String)request.getAttribute("message");

       out.println("Status: "+String.valueOf(status)+"<br>");

       if(Boolean.TRUE.equals(status))
       {
    %>
            <h2 style="color:#00FF00">Upload Success</h2><br>
            <a file="<%=filename%>"></a>
    <%
       }
       else
       {
    %>
            <h2 style="color:#FF0000">Upload Failed</h2>
            <%=filename%><br>
            Error:<%=message%>
    <%
       }
    %>
</body>
</html>

Τα αρχεία μου έχουν την δομή αυτή (κάνω compile με Maven):

.
├── pom.xml
├── simple-servlet.iml
└── src
    └── main
        ├── java
        │   └── test
        │       ├── FileUpload.java
        │       ├── Params.java
        │       └── Test.java
        ├── resources
        └── webapp
            ├── index.html
            ├── uploads
            ├── views
            │   ├── message.jsp
            │   ├── upload.jsp
            │   └── upload_sucess.jsp
            └── WEB-INF
                └── web.xml

Το pom.xml έχει:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>web</groupId>
  <artifactId>simple-servlet</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>simple-servlet Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
         <groupId>javax.servlet</groupId>
         <artifactId>javax.servlet-api</artifactId>
         <version>3.0.1</version>
         <scope>provided</scope>
    </dependency>
  </dependencies>

  <build>
      <plugins>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>2.3.2</version>
          <configuration>
              <source>1.7</source>
              <target>1.7</target>
          </configuration>
        </plugin>
      </plugins>
     <finalName>simple-servlet</finalName>
  </build>
</project>

Και το web.xml:

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Testing Servlets</display-name>

    <filter>
        <filter-name>setCharacterEncodingFilter</filter-name>
        <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <async-supported>true</async-supported>
    </filter>

    <filter-mapping>
        <filter-name>setCharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <jsp-config>
        <jsp-property-group>
            <url-pattern>*.jsp</url-pattern>
            <page-encoding>UTF-8</page-encoding>
        </jsp-property-group>
    </jsp-config>

    <servlet>
        <servlet-name>Test</servlet-name>
        <servlet-class>test.Test</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>Test</servlet-name>
        <url-pattern>/test</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>FileUpload</servlet-name>
        <servlet-class>test.FileUpload</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>FileUpload</servlet-name>
        <url-pattern>/files</url-pattern>
    </servlet-mapping>

    <multipart-config>
        <location>/tmp</location>
        <max-file-size>20848820</max-file-size>
        <max-request-size>418018841</max-request-size>
        <file-size-threshold>1048576</file-size-threshold>
    </multipart-config>
</web-app>

Το θέμα είναι ότι στο Ubuntu μηχάνημά μου όταν κάνω deploy το servlet (εφόσον το πακετάρω σε war) δεν μου κάνει το upload λόγο ότι  δεν βρίσκει τον κατάλογο. Κανείς ιδέα;

 

Ιδού και ένα Screenshot από αν εκτέλεσα τον κώδικα:

post-141042-0-98093000-1428759469_thumb.png

Δημοσ.

/uploads/....

 

Για το debugger που λέγαμε;

Μου λες για Debugger και δεν προτείνεις κανέναν σε Intellij τρέχοντας σε Tomcat.

Χαίρο Πολύ.

 

Και μου αρέσει ότι έχω βάλει τον φάκελο στο project.

 

Και να πω την αλήθεια με βολεύει καλύτερα να τα στέλων σε FTP που θα χρησιμεύει σαν CDN. Συνήθωε σε php αποθηκευόταν εκεί που είναι το Htdocs η σε απλά ελληνικά σε φάκελο που ξεκινά το root του project - webapp.

 

Αλλά άλλο σε java. Δηλαδή πρέπει να ορίσω ένα ΠΛΗΡΕΣ path (πχ. /home/....../uploads). Αν ναι συνήθωε σε τέτοιου είδους Applications που το ορίζουν;

Δημοσ.

Δεν ασχολουμαι με java ποσο μαλλον με jsp, για να σου προτεινω μια λυση. Απλα αποκλειεται να μην υπαρχει debugger σε ενα framework της προκοπης. Googlare και δοκιμασε.

 

Χωρις debugger δεν πας πουθενα, δηλαδη κοιτα το ποστ. Ποσταρες ολο το project (για δευτερη φορα)... Εαν ειχες debugger, θα εβλεπες οτι το fileName εχει την τιμη uploads/μπλα μπλα και οτι το προβλημα σου ειναι στο FileOutputStream.

 

Btw. Το σωστο path ειναι ./uploads οπου το dot ειναι το working directory. Εαν το εκανες αυτο, τοτε παλι θα ειχες προβλημα, επειδη ενας random τυπος λεει οτι δεν μπορεις να εχεις τα uploads στο directory του servlet. Επισης ενας αλλος random τυπος μας λεει, οτι μια ωραια λυση ειναι, εφοσον φτιαξεις τον καταλογο, να τον κανεις configure στο web.xml

 

πχ

upload directory

x:\this\is\my\uploads

 

web.xml

...
<servlet>
 <servlet-name... />
 <init-param>
  <param-name>uploads</prama-name>
  <param-value>x:\this\is\my\uploads</param-value>
 </init-param>
</servlet>
Επειτα στο κωδικα να το παρεις απο το  https://docs.oracle.com/javaee/6/api/javax/servlet/GenericServlet.html#init(javax.servlet.ServletConfig) 

 

και

 

https://docs.oracle.com/javaee/6/api/javax/servlet/ServletConfig.html#getInitParameter(java.lang.String)

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...