2016-12-21 48 views
2

ファイルアップロードとJSON本体の両方を構成部分として含むマルチパートメッセージを受け入れるSpring MVC RESTサービスを実装しました。Multipart Spring MVCファイルアップロードで.tmpファイルが削除されない

マイコントローラー:

@RestController 
    public class MyController { 

    @Autowired 
    private MyService myService; 

    @RequestMapping(value = "/publish", method = RequestMethod.POST, 
      consumes = "multipart/form-data", produces = "application/json") 
    public PublishContentResponse publishContent(@RequestPart("json") PublishContentRequest request, @RequestPart("file") MultipartFile file) throws IOException { 
     PublishContentResponse response = myService.publishContent(request, file); 
     return response; 
    } 
} 

私のサーブレット初期化子:

public class MyServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 

    @Override 
    protected Class<?>[] getRootConfigClasses() { 
     return new Class[]{}; 
    } 

    @Override 
    protected Class<?>[] getServletConfigClasses() { 
     return new Class[]{MyConfig.class}; 
    } 

    @Override 
    protected String[] getServletMappings() { 
     return new String[]{"/mypath/*"}; 
    } 

    @Override 
    protected void customizeRegistration(ServletRegistration.Dynamic registration) { 
     registration.setMultipartConfig(getMultipartConfigElement()); 
    } 

    private MultipartConfigElement getMultipartConfigElement() { 
     loadServletProperties(); 
     MultipartConfigElement multipartConfigElement = new MultipartConfigElement("c:/temp/", 5242880, 20971520, 0); 
     return multipartConfigElement; 
    } 
} 

マイ設定:

@Configuration 
@ComponentScan 
@EnableWebMvc 
public class MyConfig extends WebMvcConfigurerAdapter { 

    @Override 
    public void configureDefaultServletHandling(final DefaultServletHandlerConfigurer configurer) { 
     configurer.enable(); 
    } 

    @Bean 
    public MultipartResolver multipartResolver() { 
     return new StandardServletMultipartResolver(); 
    } 

    } 

私の問題は一時的な場所が定義されていることである。ここ関わる主なクラスがありますサーブレットイニシャライザ(C:/ temp /)には、この要求があるたびに作成される.tmpフォルダが含まれていますサービスと削除されることはありません。メモ帳でそれらを開くと、要求に送信されたJSONのプレーンテキストコピーのみが含まれていて、アップロードされたファイルのバイトは含まれていないようです。私の人生は、処理後にこれらのファイルが消えるようにする方法を考え出すことができません。今のところ私はそれぞれの呼び出しの後に FileUtils.cleanDirectory( "C /:temp /")を使用することに頼っていましたが、私はこの解決策に全く満足していません。誰も私がこれらの.tmpファイルを削除するために何ができるか考えている?

答えて

2

最後に、何らかの理由でJVMがガベージコレクションを行っていなかったため、.tmpファイルが永遠に永続していたことがわかりました。私は強くJVMを示唆することで、この問題を解決することができた非常に不満足な解決策は、ごみが

System.gc(); 

でファイルアップロードの終わりに収集しなかったがまだそれがガベージコレクションされなかった理由を見つけることが良いでしょう最初は私が今はこれをあきらめています!

関連する問題