2011-06-18 11 views
1

クライアントからサーバーにイメージをアップロードします。私はすでに素形のようなガジェットを使ってやっていました。しかし、今回は、私自身でそれをやろうとしています。ウェブ上の情報をどのように見つけましたか、私は固執しています。 私の現在の問題は、アップロードを行うために作成したタグが拘束されていないことをブラウザが教えていることです。私は、なぜアプリケーションがそれを見つけられないのか、どうすればそれを解決するのかを理解したいと思います。あなたは私が間違いを見つけることができますので、私は私が今までやったすべてを貼り付けます自分のイメージアップローダー(JSF)を作成しようとしています

libフォルダに1.Addedコモンズ・ファイルアップロード-1.2.1.jarとコモンズ-IO-1.4.jar (自動的にクラスパスに追加されます)

enter image description here

2.Created(これは、WEB-INFフォルダ内に置かれている)

タグライブラリを利用できるようにウィルXML
<?xml version="1.0" encoding="UTF-8"?> 
<facelet-taglib version="2.0" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"> 
    <namespace>http://corejsf.com</namespace> 
    <tag> 
     <tag-name>upload</tag-name> 
     <component> 
     <component-type>javax.faces.Input</component-type> 
     <renderer-type>com.corejsf.Upload</renderer-type> 
     </component> 
    </tag> 
</facelet-taglib> 

3.タグを実装するためのパッケージを作成し、com.corejsfという新しいパッケージに置きます。ここで

enter image description here

がソースである:

package com.corejsf; 

import java.io.File; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.UnsupportedEncodingException; 
import javax.el.ValueExpression; 
import javax.faces.FacesException; 
import javax.faces.component.EditableValueHolder; 
import javax.faces.component.UIComponent; 
import javax.faces.context.ExternalContext; 
import javax.faces.context.FacesContext; 
import javax.faces.context.ResponseWriter; 
import javax.faces.render.FacesRenderer; 
import javax.faces.render.Renderer; 
import javax.servlet.ServletContext; 
import javax.servlet.http.HttpServletRequest; 
import org.apache.commons.fileupload.FileItem; 

@FacesRenderer(componentFamily="javax.faces.Input", 
    rendererType="com.corejsf.Upload") 
public class UploadRenderer extends Renderer { 
    public void encodeBegin(FacesContext context, UIComponent component) 
     throws IOException { 
     if (!component.isRendered()) return; 
     ResponseWriter writer = context.getResponseWriter(); 

     String clientId = component.getClientId(context); 

     writer.startElement("input", component); 
     writer.writeAttribute("type", "file", "type"); 
     writer.writeAttribute("name", clientId, "clientId"); 
     writer.endElement("input"); 
     writer.flush(); 
    } 

    public void decode(FacesContext context, UIComponent component) { 
     ExternalContext external = context.getExternalContext(); 
     HttpServletRequest request = (HttpServletRequest) external.getRequest(); 
     String clientId = component.getClientId(context); 
     FileItem item = (FileItem) request.getAttribute(clientId); 

     Object newValue; 
     ValueExpression valueExpr = component.getValueExpression("value"); 
     if (valueExpr != null) { 
     Class<?> valueType = valueExpr.getType(context.getELContext()); 
     if (valueType == byte[].class) { 
      newValue = item.get(); 
     } 
     else if (valueType == InputStream.class) { 
      try { 
       newValue = item.getInputStream(); 
      } catch (IOException ex) { 
       throw new FacesException(ex); 
      } 
     } 
     else { 
      String encoding = request.getCharacterEncoding(); 
      if (encoding != null) 
       try { 
        newValue = item.getString(encoding); 
       } catch (UnsupportedEncodingException ex) { 
        newValue = item.getString(); 
       } 
      else 
       newValue = item.getString(); 
     } 
     ((EditableValueHolder) component).setSubmittedValue(newValue); 
     ((EditableValueHolder) component).setValid(true); 
     } 

     Object target = component.getAttributes().get("target"); 

     if (target != null) { 
     File file; 
     if (target instanceof File) 
      file = (File) target; 
     else { 
      ServletContext servletContext 
       = (ServletContext) external.getContext(); 
      String realPath = servletContext.getRealPath(target.toString()); 
      file = new File(realPath); 
     } 

     try { // ugh--write is declared with "throws Exception" 
      item.write(file); 
     } catch (Exception ex) { 
      throw new FacesException(ex); 
     } 
     } 
    } 
} 

4.Then私は、カスタムタグの実装として要求をインターセプトするために区別するために、サーブレットフィルタを追加し、同じパッケージの中に置かれ

enter image description here

これは、その源である:私はweb.xmlにフィルタを登録

package com.corejsf; 

import java.io.File; 
import java.io.IOException; 
import java.util.Collections; 
import java.util.Enumeration; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletRequestWrapper; 
import org.apache.commons.fileupload.FileItem; 
import org.apache.commons.fileupload.FileUploadException; 
import org.apache.commons.fileupload.disk.DiskFileItemFactory; 
import org.apache.commons.fileupload.servlet.ServletFileUpload; 

public class UploadFilter implements Filter { 
    private int sizeThreshold = -1; 
    private String repositoryPath; 

    public void init(FilterConfig config) throws ServletException { 
     repositoryPath = config.getInitParameter(
     "com.corejsf.UploadFilter.repositoryPath"); 
     try { 
     String paramValue = config.getInitParameter(
      "com.corejsf.UploadFilter.sizeThreshold"); 
     if (paramValue != null) 
      sizeThreshold = Integer.parseInt(paramValue); 
     } 
     catch (NumberFormatException ex) { 
     ServletException servletEx = new ServletException(); 
     servletEx.initCause(ex); 
     throw servletEx; 
     } 
    } 

    public void destroy() { 
    } 

    public void doFilter(ServletRequest request, 
     ServletResponse response, FilterChain chain) 
     throws IOException, ServletException { 

     if (!(request instanceof HttpServletRequest)) { 
     chain.doFilter(request, response); 
     return; 
     } 

     HttpServletRequest httpRequest = (HttpServletRequest) request; 

     boolean isMultipartContent 
     = ServletFileUpload.isMultipartContent(httpRequest); 
     if (!isMultipartContent) { 
     chain.doFilter(request, response); 
     return; 
     } 

     DiskFileItemFactory factory = new DiskFileItemFactory(); 
     if (sizeThreshold >= 0) 
     factory.setSizeThreshold(sizeThreshold); 
     if (repositoryPath != null) 
     factory.setRepository(new File(repositoryPath)); 
     ServletFileUpload upload = new ServletFileUpload(factory); 

     try { 
     @SuppressWarnings("unchecked") List<FileItem> items 
      = (List<FileItem>) upload.parseRequest(httpRequest); 
     final Map<String, String[]> map = new HashMap<String, String[]>(); 
     for (FileItem item : items) { 
      String str = item.getString(); 
      if (item.isFormField()) 
       map.put(item.getFieldName(), new String[] { str }); 
      else 
       httpRequest.setAttribute(item.getFieldName(), item); 
     } 

     chain.doFilter(new 
      HttpServletRequestWrapper(httpRequest) { 
       public Map<String, String[]> getParameterMap() { 
        return map; 
       }     
       // busywork follows ... should have been part of the wrapper 
       public String[] getParameterValues(String name) { 
        Map<String, String[]> map = getParameterMap(); 
        return (String[]) map.get(name); 
       } 
       public String getParameter(String name) { 
        String[] params = getParameterValues(name); 
        if (params == null) return null; 
        return params[0]; 
       } 
       public Enumeration<String> getParameterNames() { 
        Map<String, String[]> map = getParameterMap(); 
        return Collections.enumeration(map.keySet()); 
       } 
      }, response); 
     } catch (FileUploadException ex) { 
     ServletException servletEx = new ServletException(); 
     servletEx.initCause(ex); 
     throw servletEx; 
     }  
    } 
} 

5.Then。 (私は、アノテーションを使用していたが、私はアノテーションであることを行うことができますどのようにsomeonを知っているか、知りませんでした?) もcorejsf.taglib.xml

<!-- NEEDED FOR FILE UPLOAD --> 
<filter> 
     <filter-name>Upload Filter</filter-name> 
     <filter-class>com.corejsf.UploadFilter</filter-class> 
     <init-param> 
     <param-name>sizeThreshold</param-name> 
     <param-value>1024</param-value> 
     </init-param> 
</filter> 

    <filter-mapping> 
     <filter-name>Upload Filter</filter-name> 
     <url-pattern>/faces/upload/*</url-pattern> 
    </filter-mapping> 

    <context-param> 
     <param-name>javax.faces.PROJECT_STAGE</param-name> 
     <param-value>Development</param-value> 
    </context-param> 
    <context-param> 
     <param-name>facelets.LIBRARIES</param-name> 
     <param-value>/WEB-INF/corejsf.taglib.xml</param-value> 
    </context-param> 

6.On私を追加しましたWebContentフォルダーIは、アップロード(アップロードされたファイルの送信先)

enter image description here

7.Inside私は、アップロードのためのタグを使用して提出しても作成する管理対象Beanのメソッドを使用するJSFページと呼ばれるサブフォルダを作成しましたファイルna MES:

.... 

<corejsf:upload target="upload/#{placeAddController.prepareUniqueIdentifier}" /> 

.... 

<h:commandButton value="Dalje" style=" font-weight: bold; font-size:150%; action="/submittedImage" /> 

とJava managedbean:

@ManagedBean 
@RequestScoped 
public class PlaceAddControler { 
… 
public String prepareUniqueIdentifier() { 
     return UUID.randomUUID().toString()+"png"; 
    } 

私は新しいタグが追加されたページに移動されたときに表示されるエラーがこれです:

javax.faces.view.facelets.FaceletException: Error Parsing /oglas.xhtml: Error Traced[line: 183] The prefix "corejsf" for element "corejsf:upload" is not bound. 
    at com.sun.faces.facelets.compiler.SAXCompiler.doCompile(SAXCompiler.java:387) 
    at com.sun.faces.facelets.compiler.SAXCompiler.doMetadataCompile(SAXCompiler.java:370) 
    at com.sun.faces.facelets.compiler.Compiler.metadataCompile(Compiler.java:123) 
    at com.sun.faces.facelets.impl.DefaultFaceletFactory.createMetadataFacelet(DefaultFaceletFactory.java:353) 
    at com.sun.faces.facelets.impl.DefaultFaceletFactory.getMetadataFacelet(DefaultFaceletFactory.java:231) 
    at com.sun.faces.facelets.impl.DefaultFaceletFactory.getMetadataFacelet(DefaultFaceletFactory.java:164) 
    at com.sun.faces.application.view.ViewMetadataImpl.createMetadataView(ViewMetadataImpl.java:102) 
    at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:239) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:110) 
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312) 
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641) 
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97) 
    at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185) 
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165) 
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791) 
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693) 
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954) 
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170) 
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88) 
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76) 
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53) 
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57) 
    at com.sun.grizzly.ContextTask.run(ContextTask.java:69) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309) 
    at java.lang.Thread.run(Thread.java:662) 

- どのような私は行方不明ですか?

- アップロードフォルダ内で、固有のfileNameを使用してクライアントからサーバーファイルシステムにファイルを転送するには、他に何が必要ですか。

最終的な目標は、このイメージをデータベースに追加することではなく、ファイルシステムに残すことです。

誰かが私を助けてくれることを願っています。

UPDATE私は自分のページに、のxmlnsを追加し、それは例外で、固定

のxmlns:corejsf = "http://corejsf.com"

をしかし、なぜボタンをクリックすると、ファイルがアップロードされないのですか?

答えて

1

まだFacelets、PrimeFacesなどと同じように、XML名前空間をページに追加する必要があります。これは "接頭辞が拘束されていません"というエラーを解決するはずです。

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:corejsf="http://corejsf.com"> 
+0

はい私はそれを忘れました。例外が修正されました。ありがとう。私はまだ投稿をクリックした後、アップロードフォルダにファイルが表示されません。何故ですか? – sfrj

+0

私はすぐにそれを見ることはできません。もしあなたがまだ持っていなければ、私はデバッガを使ってステップ実行することをお勧めします。 –

+0

私は試してみます。 ''実際にフォームを提出できる 'action ="/submittedImage "'が唯一のものだと私はすでに確認しています。どうすればそれをチェックできますか? – sfrj

関連する問題