Umožněn upload obrázku podpisu uživatele. Menu Nastavení -> Uživatelské
nastavení. refs #132multitenant
							parent
							
								
									d454c211f8
								
							
						
					
					
						commit
						d108f4a070
					
				@ -0,0 +1,18 @@
 | 
				
			|||||||
 | 
					package info.bukova.isspst.storage;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.io.File;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public interface FileStorage {
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					//	public String getRootPath();
 | 
				
			||||||
 | 
						public void saveFile(byte[] data, String fileName);
 | 
				
			||||||
 | 
						public void saveFile(File file, String path);
 | 
				
			||||||
 | 
						public void removeFile(String fileName);
 | 
				
			||||||
 | 
						public void moveFile(String source, String destination);
 | 
				
			||||||
 | 
						public void createDirectory(String dir);
 | 
				
			||||||
 | 
						public byte[] fileData(String fileName);
 | 
				
			||||||
 | 
						public File file(String fileName);
 | 
				
			||||||
 | 
						public boolean dirExists(String path);
 | 
				
			||||||
 | 
						public String serverPath(String fileName);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,146 @@
 | 
				
			|||||||
 | 
					package info.bukova.isspst.storage;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.io.File;
 | 
				
			||||||
 | 
					import java.io.FileInputStream;
 | 
				
			||||||
 | 
					import java.io.FileNotFoundException;
 | 
				
			||||||
 | 
					import java.io.FileOutputStream;
 | 
				
			||||||
 | 
					import java.io.IOException;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import javax.servlet.ServletContext;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class LocalFileStorage implements FileStorage {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private String rootPath;
 | 
				
			||||||
 | 
						private ServletContext context;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public void setRootPath(String rootPath) {
 | 
				
			||||||
 | 
							this.rootPath = rootPath;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public void setContext(ServletContext ctx) {
 | 
				
			||||||
 | 
							this.context = ctx;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private String getFullPath() {
 | 
				
			||||||
 | 
							return context.getRealPath(rootPath) + File.separator;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public void saveFile(byte[] data, String fileName) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							File file = new File(getFullPath() + fileName);
 | 
				
			||||||
 | 
							FileOutputStream os = null;
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								os = new FileOutputStream(file);
 | 
				
			||||||
 | 
								os.write(data);
 | 
				
			||||||
 | 
								os.flush();
 | 
				
			||||||
 | 
								os.close();
 | 
				
			||||||
 | 
							} catch (FileNotFoundException e) {
 | 
				
			||||||
 | 
								e.printStackTrace();
 | 
				
			||||||
 | 
							} catch (IOException e) {
 | 
				
			||||||
 | 
								e.printStackTrace();
 | 
				
			||||||
 | 
							} finally {
 | 
				
			||||||
 | 
								try {
 | 
				
			||||||
 | 
									if (os != null) {
 | 
				
			||||||
 | 
										os.flush();
 | 
				
			||||||
 | 
										os.close();
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} catch (IOException e) {
 | 
				
			||||||
 | 
									throw new StorageException("Cannot close stream", e.getCause());
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public void saveFile(File file, String path) {
 | 
				
			||||||
 | 
							File dest = new File(getFullPath() + path + File.pathSeparator + file.getName());
 | 
				
			||||||
 | 
							FileOutputStream fos = null;
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								fos = new FileOutputStream(dest);
 | 
				
			||||||
 | 
								fos.write(fileData(file.getName()));
 | 
				
			||||||
 | 
								fos.flush();
 | 
				
			||||||
 | 
								fos.close();
 | 
				
			||||||
 | 
							} catch (FileNotFoundException e) {
 | 
				
			||||||
 | 
								throw new StorageException("Cannot move file: " + file.getName(), e.getCause());
 | 
				
			||||||
 | 
							} catch (IOException e) {
 | 
				
			||||||
 | 
								throw new StorageException("Cannot move file: " + file.getName(), e.getCause());
 | 
				
			||||||
 | 
							} finally {
 | 
				
			||||||
 | 
								if (fos != null) {
 | 
				
			||||||
 | 
									try {
 | 
				
			||||||
 | 
										fos.flush();
 | 
				
			||||||
 | 
										fos.close();
 | 
				
			||||||
 | 
									} catch (IOException e) {
 | 
				
			||||||
 | 
										throw new StorageException("Cannot close stream", e.getCause());
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public void removeFile(String fileName) {
 | 
				
			||||||
 | 
							File f = new File(getFullPath() + fileName);
 | 
				
			||||||
 | 
							if (!f.delete()) {
 | 
				
			||||||
 | 
								throw new StorageException("Cannot delete file: " + getFullPath()
 | 
				
			||||||
 | 
										+ fileName);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public byte[] fileData(String fileName) {
 | 
				
			||||||
 | 
							File f = new File(getFullPath() + fileName);
 | 
				
			||||||
 | 
							byte[] out = new byte[(int) f.length()];
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							FileInputStream fis = null;
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								fis = new FileInputStream(f);
 | 
				
			||||||
 | 
								fis.read(out);
 | 
				
			||||||
 | 
								fis.close();
 | 
				
			||||||
 | 
							} catch (FileNotFoundException e) {
 | 
				
			||||||
 | 
								throw new StorageException("File cannot be found: " + fileName, e.getCause());
 | 
				
			||||||
 | 
							} catch (IOException e) {
 | 
				
			||||||
 | 
								throw new StorageException("Cannot read file: " + fileName, e.getCause());
 | 
				
			||||||
 | 
							} finally {
 | 
				
			||||||
 | 
								if (fis != null) {
 | 
				
			||||||
 | 
									try {
 | 
				
			||||||
 | 
										fis.close();
 | 
				
			||||||
 | 
									} catch (IOException e) {
 | 
				
			||||||
 | 
										throw new StorageException("Cannot close stream", e.getCause());
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
							return out;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public File file(String fileName) {
 | 
				
			||||||
 | 
							return new File(getFullPath() + fileName);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public void moveFile(String source, String destination) {
 | 
				
			||||||
 | 
							saveFile(new File(getFullPath() + source), destination);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public void createDirectory(String dir) {
 | 
				
			||||||
 | 
							File f = new File(getFullPath() + dir);
 | 
				
			||||||
 | 
							if (!f.mkdir()) {
 | 
				
			||||||
 | 
								throw new StorageException("Cannot create directory: "
 | 
				
			||||||
 | 
										+ getFullPath() + dir);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public boolean dirExists(String path) {
 | 
				
			||||||
 | 
							File f = new File(getFullPath() + path);
 | 
				
			||||||
 | 
							return f.exists() && f.isDirectory();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public String serverPath(String fileName) {
 | 
				
			||||||
 | 
							return context.getRealPath(rootPath + File.separator + fileName);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					package info.bukova.isspst.storage;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import info.bukova.isspst.services.IsspstException;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class StorageException extends IsspstException {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private static final long serialVersionUID = -1303880908451845756L;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public StorageException(String reason) {
 | 
				
			||||||
 | 
							super(reason);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public StorageException(String reason, Throwable cause) {
 | 
				
			||||||
 | 
							super(reason, cause);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,86 @@
 | 
				
			|||||||
 | 
					package info.bukova.isspst.ui.settings;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import info.bukova.isspst.data.UserSettingsData;
 | 
				
			||||||
 | 
					import info.bukova.isspst.services.users.UserService;
 | 
				
			||||||
 | 
					import info.bukova.isspst.storage.FileStorage;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.awt.image.RenderedImage;
 | 
				
			||||||
 | 
					import java.io.IOException;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import javax.imageio.ImageIO;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.zkoss.bind.annotation.BindingParam;
 | 
				
			||||||
 | 
					import org.zkoss.bind.annotation.Command;
 | 
				
			||||||
 | 
					import org.zkoss.bind.annotation.ContextParam;
 | 
				
			||||||
 | 
					import org.zkoss.bind.annotation.ContextType;
 | 
				
			||||||
 | 
					import org.zkoss.bind.annotation.Init;
 | 
				
			||||||
 | 
					import org.zkoss.bind.annotation.NotifyChange;
 | 
				
			||||||
 | 
					import org.zkoss.zk.ui.event.UploadEvent;
 | 
				
			||||||
 | 
					import org.zkoss.zk.ui.select.annotation.WireVariable;
 | 
				
			||||||
 | 
					import org.zkoss.zul.Window;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class UserSettingsVM {
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						@WireVariable
 | 
				
			||||||
 | 
						private UserService userService;
 | 
				
			||||||
 | 
						@WireVariable
 | 
				
			||||||
 | 
						private FileStorage storage;
 | 
				
			||||||
 | 
						private UserSettingsData settings;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						@Init
 | 
				
			||||||
 | 
						public void init() {
 | 
				
			||||||
 | 
							settings = userService.getUserSettings();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public UserSettingsData getSettings() {
 | 
				
			||||||
 | 
							return settings;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						@Command
 | 
				
			||||||
 | 
						@NotifyChange({"settings", "signatureImg"})
 | 
				
			||||||
 | 
						public void uploadSignature(@ContextParam(ContextType.TRIGGER_EVENT) UploadEvent upEvent) {
 | 
				
			||||||
 | 
							int i = upEvent.getMedia().getName().lastIndexOf(".");
 | 
				
			||||||
 | 
							String fileName = "SignatureImageFile_" + userService.getCurrent().getUsername() + upEvent.getMedia().getName().substring(i);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							storage.saveFile(upEvent.getMedia().getByteData(), fileName);
 | 
				
			||||||
 | 
							settings.setSignatureFile(fileName);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						@Command
 | 
				
			||||||
 | 
						@NotifyChange("signatureImg")
 | 
				
			||||||
 | 
						public void removeSignature() {
 | 
				
			||||||
 | 
							settings.setSignatureFile(null);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						@Command
 | 
				
			||||||
 | 
						public void save(@BindingParam("window") Window window) {
 | 
				
			||||||
 | 
							userService.setUserSettings(settings);
 | 
				
			||||||
 | 
							userService.update(userService.getCurrent());
 | 
				
			||||||
 | 
							onClose();
 | 
				
			||||||
 | 
							window.detach();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						@Command
 | 
				
			||||||
 | 
						public void onClose() {
 | 
				
			||||||
 | 
							if (userService.getUserSettings().getSignatureFile() == null && settings.getSignatureFile() != null) {
 | 
				
			||||||
 | 
								storage.removeFile(settings.getSignatureFile());
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public boolean isCanSave() {
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public RenderedImage getSignatureImg() {
 | 
				
			||||||
 | 
							if (settings.getSignatureFile() == null || settings.getSignatureFile().isEmpty()) {
 | 
				
			||||||
 | 
								return null;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								return ImageIO.read(storage.file(settings.getSignatureFile()));
 | 
				
			||||||
 | 
							} catch (IOException e) {
 | 
				
			||||||
 | 
								return null;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					dummy file
 | 
				
			||||||
@ -0,0 +1,30 @@
 | 
				
			|||||||
 | 
					<?page title="UserSettings" contentType="text/html;charset=UTF-8"?>
 | 
				
			||||||
 | 
					<zk>
 | 
				
			||||||
 | 
					<window id="editWin" border="normal"
 | 
				
			||||||
 | 
						closable="true"
 | 
				
			||||||
 | 
						apply="org.zkoss.bind.BindComposer"
 | 
				
			||||||
 | 
						viewModel="@id('vm') @init('info.bukova.isspst.ui.settings.UserSettingsVM')"
 | 
				
			||||||
 | 
						onClose="@command('onClose')"
 | 
				
			||||||
 | 
						width="700px">
 | 
				
			||||||
 | 
						<caption
 | 
				
			||||||
 | 
								zclass="form-caption"
 | 
				
			||||||
 | 
								label="${labels.UserSettings}" />
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						<vbox>
 | 
				
			||||||
 | 
							<label value="Podpis:"/>
 | 
				
			||||||
 | 
							<hbox>
 | 
				
			||||||
 | 
								<button label="Nahrát obrázek podpisu" 
 | 
				
			||||||
 | 
									upload="true,maxsize=600,accept=image/*" 
 | 
				
			||||||
 | 
									onUpload="@command('uploadSignature')"
 | 
				
			||||||
 | 
									sclass="nicebutton"/>
 | 
				
			||||||
 | 
								<div width="400px" height="110px" style="border: 1px solid black;">
 | 
				
			||||||
 | 
									<image height="100px" content="@load(vm.signatureImg)"/>
 | 
				
			||||||
 | 
								</div>
 | 
				
			||||||
 | 
							</hbox>
 | 
				
			||||||
 | 
							<button label="Smazat" onClick="@command('removeSignature')" sclass="nicebutton"/>
 | 
				
			||||||
 | 
						</vbox>
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						<include src="/app/formButtons.zul"/>
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					</window>
 | 
				
			||||||
 | 
					</zk>
 | 
				
			||||||
					Loading…
					
					
				
		Reference in New Issue