Pregunta

private static final String DESTINATION_DIR_PATH ="/files";
private File destinationDir; 
public void init(ServletConfig config) throws ServletException {
        super.init(config);
        String realPath = getServletContext().getRealPath(DESTINATION_DIR_PATH);
        destinationDir = new File(realPath);
        if(!destinationDir.isDirectory()) {
            throw new ServletException(DESTINATION_DIR_PATH+" is not a directory");
        }

    }

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            PrintWriter out = response.getWriter();
            response.setContentType("text/html");
            out.println();
            DiskFileItemFactory  fileItemFactory = new DiskFileItemFactory ();
            fileItemFactory.setSizeThreshold(1*1024*1024);
            //fileItemFactory.setRepository(tmpDir);
            ServletFileUpload uploadHandler = new ServletFileUpload(fileItemFactory);
            try {
                    List items = uploadHandler.parseRequest(request);
                    Iterator itr = items.iterator();
                while(itr.hasNext()) {
                    FileItem item = (FileItem) itr.next();
                    if(item.isFormField()) {
                        out.println("File Name = "+item.getFieldName()+", Value = "+item.getString());
                    } else {
                        File file = new File(destinationDir,item.getName());
                        item.write(file);
                String fileToBeRead = "C:/ProgramFiles/Apache/Tomcat/webapps/Readcsv/files/"+item.getName();
try {
                            BufferedReader br = new BufferedReader(new FileReader(fileToBeRead));..... and the code goes on..

Estoy utilizando el código anterior para leer .csv archivo que se carga a través de un formulario JSP. El código funciona perfectamente bien. Pero quiero que el código sea en un formato genérico ya que el código anterior sólo está trabajando con un sistema de ventanas y no UNIX o cualquier otro sistema operativo.

String fileToBeRead = "C:/ProgramFiles/Apache/Tomcat/webapps/Readcsv/files/"+item.getName();

Esta línea particular tiene que ser cambiado para acheiving la tarea. Por favor, hágamelo saber qué se puede hacer para que el código funciona bien en cualquier sistema operativo que atraviesa. También por favor señalen todas las áreas que necesita un cambio en el código de seguridad.

¿Fue útil?

Solución

Ya tiene el archivo en file. Basta con sustituir

new FileReader(fileToBeRead)

por

new FileReader(file)

O, mejor aún, omitir por completo el paso innecesario de escribir el archivo en el disco y leer la secuencia de archivo subido inmediatamente. Reemplazar

File file = new File(destinationDir,item.getName());
item.write(file);
try {
    BufferedReader br = new BufferedReader(new FileReader(fileToBeRead));

por

try {
    BufferedReader br = new BufferedReader(new InputStreamReader(item.getInputStream()));

Es posible que desee suministrar el juego de caracteres como segundo argumento. Yo sugeriría UTF-8 para esto.

Otros consejos

La adición de las respuestas anteriores, ubicaciones de los archivos de codificación dura en el código Servlet no es una buena práctica, ya que por lo general hace que el servlet no trabajar cuando se despliega en un servidor diferente o si la aplicación Web se ejecuta directamente desde un archivo WAR comprimido. El método correcto para la lectura de un recurso de una aplicación web es mediante el uso de cualquiera de la () métodos getResource () o getResourceAsStream. Estos dos métodos aseguran el servlet siempre obtener acceso al recurso deseado, incluso si la aplicación Web se despliega en varios servidores o como un WAR comprimido.

getResourceAsStream (camino java.lang.String) : El getResourceAsStream () devuelve una instancia de un InputStream al recurso físico de una aplicación Web. Este método debe ser usado cuando una necesidad de recursos que deben leerse textualmente en lugar de procesados ??por una aplicación Web.

getResource (ruta java.lang.String) : El getResource () devuelve una dirección URL para el recurso que se asigna a una ruta especificada. Este método debe ser usado cuando una necesidad de recursos para ser leído, ya que se mostraría a un cliente.

Su código ya contiene la solución:

getServletContext().getRealPath(DESTINATION_DIR_PATH);

Esto es mucho mejor que:

String fileToBeRead = "C:/Program Files/Apache/Tomcat/...";

Otra observación: No utilice en new FileReader(), ya que no puede especificar la codificación que se utiliza para convertir los bytes del archivo a los caracteres que desea. Uso new InputStreamReader(is, encoding) lugar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top