Kawai Wiki

Rev

Rev 168 | Rev 196 | 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.apache.commons.fileupload.FileItem;
import org.kawai.dao.PageDAO;
import org.kawai.dao.UserDAO;
import org.mentawai.core.ApplicationManager;
import org.mentawai.filter.AuthenticationFree;

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() {
               
                FileItem fileItem = (FileItem) input.getValue("Filedata");
               
                if (fileItem != null) {
                       
                        String filename = fileItem.getName();
                        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 = fileItem.getInputStream();
                                byte[] data = new byte[4096];
                                int read;
                                while((read = is.read(data)) != -1) {
                                        fos.write(data, 0, read);
                                }
                                is.close();
                                fos.close();
                               
                                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;
        }
}