2014-06-09 2 views
0

이전에이 질문을 보았지만 해결 방법이 없습니다. Spring MVC를 사용하는 SmartGWT 앱이 있습니다. 이 모든 것이 훌륭하게 작동하며 RESTful 웹 서비스를 사용하고 있습니다.smartgwt 스프링 서블릿 및 파일 업로드

파일뿐만 아니라 일부 메타 데이터도 업로드 할 수있는 형식이 있습니다. 내가 사용해야하는 경우

private final String DEFAULT_FILE_UPLOAD_SERVICE_PATH = "upload"; 
private final String TARGET = "uploadTarget"; 

public FileUploadForm() 
{ 
    setEncoding(Encoding.MULTIPART); 
    setMethod(FormMethod.POST); 

    setAutoFetchData(false); 
    setDataSource(fileUploadDS); 

    setTitleOrientation(TitleOrientation.TOP); 
    setNumCols(1); 
    setColWidths("*"); 

    uploadFileIdItem.setRequired(true); 
    uploadFileIdItem.setDefaultValue(0); 
    uploadFileIdItem.setVisible(false); 
    uploadFileIdItem.setShowTitle(false); 

    // ========================================================================== 

    fileUploadTypeSelectItem.setShowTitle(false); 
    fileUploadTypeSelectItem.setName(Constants.FILE_UPLOAD_UPLOADTYPE); 
    fileUploadTypeSelectItem.setPickListWidth(TEXT_SIZE); 
    fileUploadTypeSelectItem.setTitle(Constants.TITLE_FILE_UPLOAD_UPLOADTYPE); 
    fileUploadTypeSelectItem.setOptionDataSource(fileUploadTypeDS); 
    fileUploadTypeSelectItem.setRequired(true); 
    fileUploadTypeSelectItem.setDisplayField(Constants.FILE_UPLOAD_UPLOADTYPE_NAME); 
    fileUploadTypeSelectItem.setValueField(Constants.FILE_UPLOAD_UPLOADTYPE_ID); 
    fileUploadTypeSelectItem.setDataPath("fileUploadType/fileUploadTypeId"); 

    // ========================================================================== 

    setAction(GWT.getHostPageBaseURL() + "rest/" + DEFAULT_FILE_UPLOAD_SERVICE_PATH); 

    ButtonItem uploadButton = new ButtonItem("Upload"); 

    uploadButton.addClickHandler(new com.smartgwt.client.widgets.form.fields.events.ClickHandler() 
    { 
     @Override 
     public void onClick(com.smartgwt.client.widgets.form.fields.events.ClickEvent event) 
     { 
      submitForm(); 
     } 
    }); 

    FileItem uploadItem = new FileItem(Constants.FILENAME); 
    uploadItem.setTitle(Constants.FILENAME); 

    setFields(uploadFileIdItem, fileUploadTypeSelectItem, uploadItem, uploadButton); 
} 

그래서, 나도 몰라 : 이 양식과 관련된 데이터 소스가 에, setAction (GWT.getHostPageBaseURL() + "나머지 /"+ DEFAULT_FILE_UPLOAD_SERVICE_PATH을); 또는 setAction (GWT.getHostPageBaseURL() + DEFAULT_FILE_UPLOAD_SERVICE_PATH); 또는 setAction (GWT.getHostPageBaseURL() + DEFAULT_FILE_UPLOAD_SERVICE_PATH);

이들 중 아무 것도 작동하지 않는 것 같습니다. 파일 이름을 업로드하기 위해 데이터를 제출하고 끊임없이 HTTP 404 오류가 발생합니다.

서블릿 용 web.xml 파일에 특별한 내용을 정의하지 않았습니다.

<context:component-scan base-package="com.myself.products.app.server.controller" /> 

을 그리고 서블릿은 실제로 다음과 같이 정의된다 : 는 대신, springmvc - 서블릿은 포함 당신이이 웹 사이트를 따라하기 전에 코드, 그리고 몇몇 다른 사람을 본 적이

@SuppressWarnings("serial") 
@Controller 
@RequestMapping("/upload") 
public class FileUploadServlet extends HttpServlet 
{ 
    private final Logger logger = LoggerFactory.getLogger(FileUploadServlet.class); 

    @Override 
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{ 
    this.process(request, response); 
} 

@Override 
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{ 
    this.process(request, response); 
} 

private void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{ 
    // check that we have a file upload request 
    if (ServletFileUpload.isMultipartContent(request)) 
    { 
     processFiles(request, response); 
    } 
} 

private File tmpDir; 
private static final String DESTINATION_DIR_PATH = "/files/upload"; 
private File destinationDir; 

public void init(ServletConfig config) throws ServletException 
{ 
    super.init(config); 

    tmpDir = new File(((File) getServletContext().getAttribute("javax.servlet.context.tempdir")).toString()); 

    if (!tmpDir.isDirectory()) 
    { 
     throw new ServletException(tmpDir.toString() + " is not a directory"); 
    } 

    logger.debug("tmpDir: " + tmpDir.toString()); 

    String realPath = getServletContext().getRealPath(DESTINATION_DIR_PATH); 
    destinationDir = new File(realPath); 

    if (!destinationDir.isDirectory()) 
    { 
     throw new ServletException(DESTINATION_DIR_PATH + " is not a directory"); 
    } 
} 

private void processFiles(HttpServletRequest request, HttpServletResponse response) throws ServletException, 
    IOException 
{ 

    // create a factory for disk-based file items 
    DiskFileItemFactory factory = new DiskFileItemFactory(); 

    // set the size threshold, above which content will be stored on disk 
    factory.setSizeThreshold(1 * 1024 * 1024); // 1 MB 

    // set the temporary directory (this is where files that exceed the threshold will be stored) 
    factory.setRepository(tmpDir); 

    // create a new file upload handler 
    ServletFileUpload upload = new ServletFileUpload(factory); 

    try 
    { 
     // parse the request 
     List<?> items = upload.parseRequest(request); 

     // process the uploaded items 
     Iterator<?> itr = items.iterator(); 

     while (itr.hasNext()) 
     { 
      FileItem item = (FileItem) itr.next(); 

      // write the uploaded file to the application's file staging area 
      File file = new File(destinationDir, item.getName()); 
      item.write(file); 
     } 

    } 
    catch (FileUploadException e) 
    { 
     logger.error("Error encountered while parsing the request", e); 
    } 
    catch (Exception e) 
    { 
     logger.error("Error encountered while uploading file", e); 
    } 
} 

.

가능하면 파일과 데이터를 제출하고 싶습니다. 그렇지만 제출하지 않으면 양식을 어떻게 제출하고 메타 데이터를 제출할 수 있습니까?

도움을 주시면 감사하겠습니다.

답변

2

단순 파일 업로드 GWT 예 web.xml을 수동으로 servler를 정의하고 있습니다 : 여기 가능한

: http://www.gwtproject.org/javadoc/latest/com/google/gwt/user/client/ui/FileUpload.html

요청과 함께 메타 데이터를 전송, 패널에 숨겨진 필드를 설정해야합니다

import com.google.gwt.user.client.ui.Hidden; 

Hidden hidden = new Hidden(); 
hidden.setName("json"); 
hidden.setVisible(false); 

hidden.setValue("simpleMetadata:testData"); 
panel.add(hidden); 
+0

그래, 내 문제가 마침내 해결 된 것 같습니다. 나는 대답을 업데이트 할 필요가있다. 그러나 이것은 본질적으로 내가 한 일이다. 감사! – tjholmes66

0

파일을 uploding하는 것과 별도로 메타 데이터를 저장하고 두 가지 형식을 제안합니다. 이것은 내가 뭘하고 나를 위해 노력하고 무엇을 : 나는 NamedFrame은 GWT 코드에서 서블릿 응답을 가져올 수 있도록 사용하고

uploadForm.setAction(GWT.getHostPageBaseURL() + "importServiceName"); 
uploadForm.setEncoding(Encoding.MULTIPART); 
uploadForm.setTarget(TARGET); 
uploadForm.setMethod(FormMethod.POST); 
fileItem = new UploadItem("file"); 
fileItem.setTitle("File"); 
fileItem.setWidth(300); 
NamedFrame frame = new NamedFrame(TARGET); 
frame.setWidth("1"); 
frame.setHeight("1"); 
frame.setVisible(false); 
uploadForm.setItems(fileItem); 

, 그러나 이것은 다른 이야기입니다. 내가

관련 문제