2014-08-28 86 views
1

內圖像我想上傳圖片文件到文件夾/ Web應用程序/照片/使用ServletContext的照片,但我每次得到NullPointerException異常如何上傳WebApp文件夾

我如何做正確?

這裏是UploadFile.class,其中NPE在CONTAINER_ROOT變量上上升。

@Component 
public class UploadFile { 

    @Autowired 
    HttpServletRequest httpServletRequest; 

    private String CONTAINER_ROOT = httpServletRequest.getSession().getServletContext().getRealPath("/"); 

    private String DIR_NAME = "foto"; 

    private String UPLOAD_DIR = CONTAINER_ROOT + File.separator + DIR_NAME; 

    private Logger logManager = LogManager.getLogger(this.getClass()); 


    public String getUploadedPath(MultipartFile file) { 
     return upload(file); 
    } 

    private String upload(MultipartFile file) { 

     if (!file.isEmpty()) try { 
      byte[] bytes = file.getBytes(); 
      String fileName = file.getOriginalFilename(); 
      File dir = new File(UPLOAD_DIR); 

      if (!dir.exists()) dir.mkdirs(); 

      File fileOnServer = new File(dir.getAbsolutePath() + File.separator + fileName); 
      BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(fileOnServer)); 
      outputStream.write(bytes); 
      outputStream.close(); 

      logManager.warn("UPLOADED FILE LOCATION: " + fileOnServer.getAbsolutePath()); 

      return fileOnServer.getPath(); 
     } 
     catch (IOException e) { 
      logManager.error("Error trying to upload file to location, or file is empty!", e.getMessage()); 
     } 
     return null; 
    } 

} 

這是我控制器上如何使用:

Foto savedFoto = this.fotoRepository.save(new Foto(this.uploadFile.getUploadedPath(file), savedImovel));

堆棧跟蹤:

Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [br.com.agenciadsw.morenoimoveis.util.UploadFile]: Constructor threw exception; nested exception is java.lang.NullPointerException 
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:164) 
28-Aug-2014 11:02:16.409 WARNING [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.loader.WebappClassLoader.clearReferencesJdbc The web application [] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered. 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:89) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1069) 
    ... 71 more 
Caused by: java.lang.NullPointerException 
    at br.com.agenciadsw.morenoimoveis.util.UploadFile.<init>(UploadFile.java:26) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408) 
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:148) 
    ... 73 more 

這裏web.xml

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
     version="3.1"> 

    <display-name>MorenoImoveis</display-name> 


     <servlet> 
      <servlet-name>dispacher</servlet-name> 
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
      <init-param> 
       <param-name>contextClass</param-name> 
       <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value> 
      </init-param> 
      <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value> 
       br.com.agenciadsw.morenoimoveis.cfg.PersistenceConfigurer 
       br.com.agenciadsw.morenoimoveis.cfg.SecurityConfigurer 
       br.com.agenciadsw.morenoimoveis.cfg.WebMvcConfigurer 
      </param-value> 
     </init-param> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>dispacher</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 
    <context-param> 
     <param-name>contextClass</param-name> 
     <param-value> 
      org.springframework.web.context.support.AnnotationConfigWebApplicationContext 
     </param-value> 
    </context-param> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value> 
      br.com.agenciadsw.morenoimoveis.cfg.PersistenceConfigurer 
      br.com.agenciadsw.morenoimoveis.cfg.SecurityConfigurer 
      br.com.agenciadsw.morenoimoveis.cfg.WebMvcConfigurer 
     </param-value> 
    </context-param> 

    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 


    <filter> 
     <filter-name>encodingFilter</filter-name> 
     <filter-class>org.springframework.web.filter.CharacterEncodingFilter 
     </filter-class> 
     <init-param> 
      <param-name>encoding</param-name> 
      <param-value>UTF-8</param-value> 
     </init-param> 
    </filter> 
    <filter-mapping> 
     <filter-name>encodingFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

</web-app> 

回答

0

你可以在文件夾上傳圖片的項目之外。我對幾個圖像有用

try { 
      byte[] bytes = file.getBytes(); 

      // Creating the directory to store file 
      File dir = new File(Utils.getFolderStoreImage(request.getSession().getServletContext().getRealPath("/"))); 
      if (!dir.exists()) 
       dir.mkdirs(); 
      // Create the file on server 
      serverFile = new File(Utils.getFolderStoreImage(request.getServletContext().getRealPath("/"))+System.currentTimeMillis()+"-"+UUID.randomUUID().toString()+".jpg"); 
      BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(serverFile)); 
      stream.write(bytes); 
      stream.close(); 
     } catch (Exception e) { 
      result.rejectValue("image", "error when upload image"); 
      return "product/add"; 
     } 

Utils.java

public class Utils { 
public static String getFolderStoreImage(String webContentRoot) { 
    if (webContentRoot.endsWith("\\")){ 
     webContentRoot = webContentRoot.substring(0,webContentRoot.length() - 1); 
     } 
    String folder = webContentRoot.substring(0, webContentRoot.lastIndexOf("\\") + 1) + "upload\\"; 
    return folder; 
} 

}

0

Spring組件的默認範圍是單例,因此該bean可能在應用程序啓動時初始化,其中不存在servlet請求。嘗試下面的註釋添加到類:

@Scope("request") 

您可以找到有效的bean作用域here

+0

我得到一個消息'致:java.lang.IllegalStateException:沒有線程綁定請求中找到:你是指請求屬性之外的實際Web請求,或處理最初接收線程之外的請求?如果您實際上在Web請求中操作並仍然收到此消息,則代碼可能在DispatcherServlet/DispatcherPortlet之外運行:在這種情況下,請使用RequestContextListener或RequestContextFilter來公開當前請求。「@Scope(」session「)或@Scope(「請求」) – 2014-08-28 14:32:24

+0

你使用Spring DispatcherServlet嗎?如果沒有,您必須在web.xml中啓用RequestContextListener或RequestContextFilter(在此處查找示例:http://www.theserverside.com/tutorial/How-to-Use-Spring-30-In-a-Servlet基於Web的應用程序),否則您的請求或會話範圍的bean無法訪問Spring ApplicationContext。 – dunni 2014-08-28 14:34:40

+0

是的我已經聲明瞭,我用完整的web.xml編輯了帖子我添加了像教程這樣的Filter,但沒有任何反應 – 2014-08-28 14:40:09

0

此代碼將幫助你上傳文件的任何數字。這裏MultipartFile是包org.springframework.web.multipart.MultipartFile的一個接口;

String uploadsDir = "/uploads/"; 
      String realPathtoUploads = request.getSession().getServletContext().getRealPath(uploadsDir); 

      if (!new File(realPathtoUploads).exists()) { 
       new File(realPathtoUploads).mkdir(); 
      } 

      List<MultipartFile> files = upload.getFiles(); 

      List<String> fileNames = new ArrayList<String>(); 
      try { 
       if (files != null && files.size() > 0) { 
        for (MultipartFile file : files) { 
         String fileName = file.getOriginalFilename(); 
         String filePath = realPathtoUploads + File.separator + fileName; 

         File destination = new File(filePath); 
         file.transferTo(destination); 
         fileNames.add(fileName); 


        } 
       } 
      } catch (IllegalStateException e) { 
       e.printStackTrace(); 
       isSuccess = false; 
       logger.error("Error : ", e); 
      }