java - Spring Server自动删除存储在应用程序文件夹中的文件

标签 java spring-mvc save file-manager

我有一个作为启动应用程序的 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/

相关文章:

java - 使用 Java 或 Spring 生成 PDF

Java Spring : get current mapping in the controller

r - 在 R : RData file size is very large 中的函数中保存单个对象

android - 使用 Glide 将图片保存到存储

python - 如何将工作表转换为字符串?或者我什至需要这样做?

java - 在 Java 中查找集合中的弱引用对象

java - 如何确定 Java 中两个日历对象之间传递的时间?

java - 如何启动 OpenTSDB?

java - 有没有办法在 Controller 类之外访问 Spring Controller 参数?

java - 为每个 Dao 类创建 BaseDAO