Kawai Wiki

Rev

Rev 212 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

package org.kawai.action;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Set;
import java.util.TreeSet;

import org.kawai.dao.PageDAO;
import org.kawai.dao.UserDAO;
import org.mentawai.core.ApplicationManager;
import org.mentawai.core.FileUploaded;
import org.mentawai.filter.AuthenticationFree;

/**
 * Action class LoginAction.
 *
 * @author Sergio Oliveira
 *
 */

public class FileAction extends AbstractAction implements AuthenticationFree {

        private static final String UPLOAD_DIR = "uploads";

        public FileAction(UserDAO userDAO, PageDAO pageDAO) {
                super(userDAO, pageDAO);
        }

        @Override
        public boolean bypassAuthentication(String method) {
                if (method != null && method.equals("upload")) return false;
                return false;
        }

        private String getFolderFromName(String name) {
                name = name.toLowerCase();
                if (name.endsWith(".jpg") || name.endsWith(".gif") || name.endsWith(".jpeg") || name.endsWith(".png")) {
                        return "images";
                }
                if (name.endsWith(".jar") || name.endsWith(".zip") || name.endsWith(".tar") || name.endsWith(".gz") || name.endsWith(".bzip") || name.endsWith(".war")) {
                        return "archive";
                }
                return "others";
        }

        public String upload() {

                FileUploaded fileUploaded = (FileUploaded) input.getValue("Filedata");

                if (fileUploaded != null) {

                        String filename = fileUploaded.getOriginalFilename();
                        String folder = getFolderFromName(filename);
                        String dir = ApplicationManager.getRealPath() + File.separator + UPLOAD_DIR + File.separator + folder + File.separator;

                        File file = new File(dir + filename);
                        if (file.exists()) {
                                output.setValue("status", "error");
                                output.setValue("msg", "File already exists: " + filename);
                                return AJAX;
                        }

                        try {

                                FileOutputStream fos = new FileOutputStream(file);

                                InputStream is = fileUploaded.getInpuStream();
                                byte[] data = new byte[4096];
                                int read;
                                while((read = is.read(data)) != -1) {
                                        fos.write(data, 0, read);
                                }
                                is.close();
                                fos.close();
                               
                                fileUploaded.deleteTempFile();

                                output.setValue("status", "success");
                                output.setValue("msg", "File uploaded to folder <i>" + folder + "</i>: " + filename);

                                return AJAX;

                        } catch(Exception e) {
                                e.printStackTrace();
                                output.setValue("status", "error");
                                output.setValue("msg", "Error saving file: " + filename);
                                return AJAX;
                        }

                } else {
                        output.setValue("status", "error");
                        output.setValue("msg", "Error uploading file!");
                        return AJAX;
                }
        }

        public String listFiles() {

                File[] images = (new File(ApplicationManager.getRealPath() + File.separator + "uploads" + File.separator + "images")).listFiles();
                File[] archive = (new File(ApplicationManager.getRealPath() + File.separator + "uploads" + File.separator + "archive")).listFiles();
                File[] others = (new File(ApplicationManager.getRealPath() + File.separator + "uploads" + File.separator + "others")).listFiles();

                Set<String> files = new TreeSet<String>();
                if (images != null) for(File f : images) {
                        if (f.isHidden()) continue;
                        files.add("/uploads/images/" + f.getName());
                }
                if (archive != null) for(File f : archive) {
                        if (f.isHidden()) continue;
                        files.add("/uploads/archive/" + f.getName());
                }
                if (others != null) for(File f : others) {
                        if (f.isHidden()) continue;
                        files.add("/uploads/others/" + f.getName());
                }

                output.setValue("files", files);
                return AJAX;
        }
}