2014-06-09 27 views
0

我以前在這裏看過這個問題,但沒有一個解決方案適用於我。 我有一個使用Spring MVC的SmartGWT應用程序。這一切都很好,並且我正在使用RESTful Web服務。smartgwt spring servlet和上傳文件

我有一個表單,不僅可以上傳文件,還可以上傳一些元數據。 有一個相關的DataSource這種形式:

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錯誤。

我沒有在serv.xml的web.xml文件中定義任何特別的東西。 相反,用SpringMVC-的servlet包含:

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

並且servlet實際上是這樣定義:

@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例子:

可在這裏: 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

我會建議你單獨保存一個文件,並且有兩種形式的保存元數據。這是我在做什麼,它是爲我工作:

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); 

我使用NamedFrame能夠獲取在GWT代碼servlet響應,但這是不同的故事。我在web.xml中手動定義servler