我有一个作为启动应用程序的 Spring Server。
我使用 h2 驱动程序通过 JPA 保存不同的对象。 所有这些对象都在更新 OK。
我使用这个类来管理将在服务器上更新的所有文件:
public class LocalFileManager { /** * This static factory method creates and returns a * ImageFileManager object to the caller. Feel free to customize * this method to take parameters, etc. if you want. * * @return * @throws IOException */ public static LocalFileManager get() throws IOException { return new LocalFileManager(); } private Path targetDir_ = Paths.get("locals"); // The ImageFileManager.get() method should be used // to obtain an instance private LocalFileManager() throws IOException{ if(!Files.exists(targetDir_)){ Files.createDirectories(targetDir_); } } // Private helper method for resolving Image file paths private Path getLocalPath(Postosaude g, int PictureNumberByLocal){ assert(g != null); return targetDir_.resolve("picture"+"-"+g.getId()+"-"+PictureNumberByLocal+".jpg"); } /** * This method returns true if the specified Image has binary * data stored on the file system. * * @param v * @return */ public boolean hasLocalData(Postosaude g,int i){ Path source = getLocalPath(g, i); return Files.exists(source); } /** * This method copies the binary data for the given Image to * the provided output stream. The caller is responsible for * ensuring that the specified Image has binary data associated * with it. If not, this method will throw a FileNotFoundException. * * @param v * @param out * @throws IOException */ public void copyGiftData(Postosaude g,int i, OutputStream out) throws IOException { Path source = getLocalPath(g,i); if(!Files.exists(source)){ throw new FileNotFoundException("Unable to find the referenced gift file for giftId:"+g.getId()); } Files.copy(source, out); } /** * This method reads all of the data in the provided InputStream and stores * it on the file system. The data is associated with the Image object that * is provided by the caller. * * @param v * @param ImageData * @throws IOException */ public void saveLocalData(Postosaude g,int i, InputStream localData) throws IOException{ assert(localData != null); Path target = getLocalPath(g,i); Files.copy(localData, target, StandardCopyOption.REPLACE_EXISTING); } public void deleteImageFromLocal(Postosaude g, int i) throws IOException { Path target = getLocalPath(g,i); Files.delete(target); }
}
此代码运行良好。 它正确保存了我在文件夹 /locals/
中更新的所有文件(图像),但是如果重新启动服务器,它们会自动删除.
这是 Application 类的代码,也许可以帮助您找出错误:
@EntityScan(basePackages= "palmaslab.mapas.repository") @EnableJpaRepositories(basePackages= "palmaslab.mapas.repository"/*.PostoSaudeRepository.class*/) @Configuration @EnableAutoConfiguration @ComponentScan(basePackages="palmaslab.mapas.controller") @Import({palmaslab.mapas.security.SecurityConfiguration.class}) @EnableWebMvc @PropertySource("application.properties") public class Application extends WebMvcConfigurerAdapter{ private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/" }; public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory( DataSource dataSource, JpaVendorAdapter jpaVendorAdapter) { LocalContainerEntityManagerFactoryBean lef = new LocalContainerEntityManagerFactoryBean(); lef.setDataSource(dataSource); lef.setJpaVendorAdapter(jpaVendorAdapter); lef.setPackagesToScan("palmaslab.mapas.controller"); return lef; } @Bean public JpaVendorAdapter jpaVendorAdapter() { HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter(); hibernateJpaVendorAdapter.setShowSql(true); hibernateJpaVendorAdapter.setGenerateDdl(true); //Auto creating scheme when true hibernateJpaVendorAdapter.setDatabase(Database.H2);//Database type return hibernateJpaVendorAdapter; } @Bean public SpringTemplateEngine templateEngine() { SpringTemplateEngine engine = new SpringTemplateEngine(); Set<IDialect> dialects = new HashSet<IDialect>(); dialects.add(new SpringSecurityDialect()); dialects.add(new LayoutDialect()); engine.setAdditionalDialects(dialects); LinkedHashSet<ITemplateResolver> templateResolvers = new LinkedHashSet<ITemplateResolver>(2); templateResolvers.add(templateResolverServlet()); templateResolvers.add(layoutTemplateResolverServlet()); engine.setTemplateResolvers(templateResolvers); return engine; } @Bean public ServletContextTemplateResolver layoutTemplateResolverServlet() { ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(); templateResolver.setPrefix("/WEB-INF/layout/"); templateResolver.setSuffix(""); templateResolver.setTemplateMode("LEGACYHTML5"); templateResolver.setOrder(1); templateResolver.setCacheable(false); return templateResolver; } @Bean public ServletContextTemplateResolver templateResolverServlet() { ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(); templateResolver.setPrefix("/WEB-INF/view/"); templateResolver.setSuffix(".html"); templateResolver.setTemplateMode("LEGACYHTML5"); templateResolver.setOrder(2); templateResolver.setCacheable(false); return templateResolver; } @Bean public ViewResolver thymeleafViewResolver() { ThymeleafViewResolver resolver = new ThymeleafViewResolver(); resolver.setTemplateEngine(templateEngine()); resolver.setOrder(1); resolver.setCharacterEncoding("ISO-8859-1"); resolver.setCache(false); return resolver; } @Bean public ServletRegistrationBean dispatcherRegistration() { ServletRegistrationBean registration = new ServletRegistrationBean(dispatcherServlet()); registration.addUrlMappings("/"); registration.setLoadOnStartup(1); return registration; } @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } @Bean public DispatcherServlet dispatcherServlet() { return new DispatcherServlet(); } @Bean public MultipartConfigElement multipartConfigElement() { MultipartConfigFactory factory = new MultipartConfigFactory(); factory.setMaxFileSize("999999KB"); factory.setMaxRequestSize("999999KB"); return factory.createMultipartConfig(); } @Bean public MultipartResolver multipartResolver() { CommonsMultipartResolver resolver = new CommonsMultipartResolver(); resolver.setMaxUploadSize(1000000000); return resolver; } @Bean public CommonsMultipartResolver filterMultipartResolver() { CommonsMultipartResolver resolver=new CommonsMultipartResolver(); resolver.setDefaultEncoding("ISO-8859-1"); resolver.setMaxUploadSize(500000000); resolver.setMaxInMemorySize(500000000); return resolver; } @Bean public EmbeddedServletContainerFactory servletContainer() { TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory(); factory.setPort(8080); factory.setSessionTimeout(1, TimeUnit.MINUTES); //factory.addErrorPages(new ErrorPage(HttpStatus.404, "/notfound.html")); return factory; } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { if (!registry.hasMappingForPattern("/webjars/**")) { registry.addResourceHandler("/webjars/**").addResourceLocations( "classpath:/META-INF/resources/webjars/"); } if (!registry.hasMappingForPattern("/locals/**")) { registry.addResourceHandler("/locals/**").addResourceLocations( "classpath:/locals"); } }
谁能找出我的错误?
谢谢,
最佳答案
如果您在部署应用程序的地方创建或修改文件,那么当您重新启动服务器时它们将被删除,因为应用程序将被重新部署。
如果您希望文件在重新部署后继续存在,您的存储基目录必须位于应用程序文件夹之外(例如 /srv/myapp/locals
)。
关于java - Spring Server自动删除存储在应用程序文件夹中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27661382/