2011-11-25 113 views
1

我在我的html中有一个input type = file标记,允许用户选择多个文件。该窗体的动作是一个REST Web服务:使用REST上传多个文件

@POST 
@Path("savefile") 
@Produces ({MediaType.TEXT_PLAIN}) 
public String createObjects(
     @FormDataParam("datafile") FormDataMultiPart file, 
     @FormParam("username") String unm 
     //@Context HttpServletRequest request 
     ){....} 

起初,我使用的请求对象检索请求中的所有FileItems,然后将其保存到服务器。没有问题。现在我想发送一个字符串数据和文件。为此我读了参数需要是FormDataParam类型。因此我添加了该参数。这是我的客户端代码:我不知道什么必须是文件参数的类型,允许在它的多个文件

<form id="form1" action="http://comp1:8080/RestWSGS/jersey/UploadFiles/savefile" 
     enctype="multipart/form-data" method="post"> 
     <input name="username" type="text" style="display:none" value="abc"/> 
    <input id="loadId" multiple="multiple" 
     type="file" name="datafile" required="required" autofocus="autofocus" 
     onchange="selectFiles(this)"/> 
    <div> 
    <input style="display: none;" type="submit" value="Send"> 
    </div> 
</form> 

???? 文件参数给我多个文件,或者我必须恢复到@Context注入?如果是这样,我将如何检索字符串参数?

欢迎任何帮助!

编辑: 我已经修改了我的休息WS以下几点:

@POST 
@Path("savefile") 
//@Consumes (MediaType.MULTIPART_FORM_DATA) 
public void createObjects(
     //@FormDataParam("datafile") FormDataMultiPart file, 
     //@FormParam("username") String unm 
     @Context HttpServletRequest request 
     ) 
{ 
    try 
    { 
     FileHandler f; 
     f = new FileHandler(new File (getClass().getResource("/" +getClass().getName().substring(
       0, getClass().getName().indexOf("."))).getPath()).getParent().replaceAll("\\\\", "\\\\\\\\") + "/mylog.log"); 
     logger.addHandler(f); 

    } 
    catch (SecurityException e1) 
    { 
     logger.info(e1.getMessage()); 

    } 
    catch (IOException e1) 
    { 
     logger.info(e1.getMessage()); 
     //e1.printStackTrace(); 
    } 


    ApplicationConstants.ROOTPATH = new File (getClass().getResource("/" +getClass().getName().substring(
      0, getClass().getName().indexOf("."))).getPath()).getParent().replaceAll("\\\\", "\\\\\\\\") ; 
    ApplicationConstants.ROOTPATH = ApplicationConstants.ROOTPATH.substring 
    (0, ApplicationConstants.ROOTPATH.indexOf("\\") + 2); 
    String user = request.getParameter("username"); 
    logger.info("ApplicationConstants.ROOTPATH" + ApplicationConstants.ROOTPATH); 


    try 
    { 
     for (Part part : request.getParts()) 
     { 
       try 
       { 
        logger.info("part = " + part.getName()); 
        if (!part.getName().equalsIgnoreCase("username")) 
        { 
         String fileName = processFileName(part.getName()); 
         part.write(new File(ApplicationConstants.ROOTPATH + user + "\\" + fileName).getPath()); 
        } 

        else 
        { 
         user = request.getParameter("username"); 
         logger.info("user = " + user); 
        } 
       } 
       catch (IOException e) 
       { 
        logger.info(e.getMessage()); 

       } 
     } 
    } 
    catch (IOException e) 
    { 

    } 
    catch (ServletException e) 
    { 

    } 
} 

但我总是正从用request.getParameter为空值(“用户名”)。我不知道什么是错的!以多部分/形式 - 数据形式发送其他数据是否违法?我需要一些指针。请在此代码中提出任何改进建议。

+0

您可以通过相关的编程语言 – JohnP

+0

一个标记它为你的问题更好的可视性非常好的例子(客户端和服务器端代码)上传多个文件通过RESTful Web服务是 - HTTP://crispcode.wordpress .com/2012/07/27/jersey-rest-web-service-to-upload-multiple-files /其他相关主题是 - http://crispcode.wordpress.com/2012/07/10/jersey-rest- Web服务对上载的文件/ – Chetan

回答

3

以下是适合我的解决方案。可以使用零件中的输入流来访问多部分/ formdata请求情况下的请求部分。我想发送一个字符串和一些文件到我的REST网络服务。我发现了一个ServletFileUpload/FIleItem示例发布在几个网站上,但我无法检索字符串(我认为如果所有数据都不是文件类型)。因此,我修改了我的web服务以下,而不是我可以做一个字符串和一些文件的处理:

private static Logger logger = Logger.getLogger("UploadFiles"); 
@POST 
@Path("savefile") 
public void createObjects(@Context HttpServletRequest request) 
{ 
    try 
    { 
     FileHandler f; 
     f = new FileHandler(new File (getClass().getResource("/" +getClass().getName().substring(
       0, getClass().getName().indexOf("."))).getPath()).getParent().replaceAll("\\\\", "\\\\\\\\") + "/mylog.log"); 
     logger.addHandler(f); 

    } 
    catch (SecurityException e1) 
    { 
     logger.info(e1.getMessage()); 

    } 
    catch (IOException e1) 
    { 
     logger.info(e1.getMessage()); 
    } 
    ApplicationConstants.ROOTPATH = new File (getClass().getResource("/" +getClass().getName().substring(
      0, getClass().getName().indexOf("."))).getPath()).getParent().replaceAll("\\\\", "\\\\\\\\") ; 
    ApplicationConstants.ROOTPATH = ApplicationConstants.ROOTPATH.substring 
    (0, ApplicationConstants.ROOTPATH.indexOf("\\") + 2); 
    String user = request.getParameter("username"); 
    logger.info("ApplicationConstants.ROOTPATH" + ApplicationConstants.ROOTPATH); 
    logger.info("username" + user); 
    try 
       { 
     for (Part part : request.getParts()) 
     { 

        logger.info("part = " + part.getName()); 
        if (!part.getName().equalsIgnoreCase("username")) 
        { 
         try { 
         BufferedInputStream in = new BufferedInputStream(part.getInputStream()); 
         String filename = getFilename(part); 
         boolean success = (new File(ApplicationConstants.ROOTPATH + user + "\\")).mkdir(); 
         if (success) { 
         System.out.println("Directory: " + ApplicationConstants.ROOTPATH + user .trim()+ "\\" + " created"); 
         } 
         else 
         { 
          System.out.println("not created"); 
         } 
         FileOutputStream out = new FileOutputStream(ApplicationConstants.ROOTPATH + user + "\\" + filename); 

         byte[] data = new byte[1000]; 
         int bytesRead = 0; 
         int offset = 0; 
         while (offset < part.getSize()) 
         { 
          bytesRead = in.read(data); 
          if (bytesRead == -1) 
          { 
           break; 
          } 
          offset += bytesRead; 
          out.write(data); 
         } 

         in.close(); 

         if (offset != part.getSize()) 
         { 
          throw new IOException("Only read " + offset + " bytes; Expected " + part.getSize() + " bytes"); 
         } 
         out.flush(); 
         out.close(); 
         } 
         catch (Exception e) 
         { 
          logger.info(e.getMessage()); 
         } 
        } 
        else 
        { 
         BufferedReader reader = new BufferedReader(new InputStreamReader(part.getInputStream(), "UTF-8")); 
         StringBuilder value = new StringBuilder(); 
         char[] buffer = new char[1024]; 
         reader.read(buffer); 
         value.append(buffer); 
         user = value.toString().trim(); 
         logger.info("user = " + value); 
        } 

} 
    } 
    catch (IOException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    catch (ServletException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

希望这可以帮助别人!