Java 使用REST上传多个文件

Java 使用REST上传多个文件,java,jakarta-ee,rest,Java,Jakarta Ee,Rest,我的html中有一个input type=file标记,允许用户选择多个文件。表单的操作是REST web服务: @POST @Path("savefile") @Produces ({MediaType.TEXT_PLAIN}) public String createObjects( @FormDataParam("datafile") FormDataMultiPart file, @FormParam("username") String unm

我的html中有一个input type=file标记,允许用户选择多个文件。表单的操作是REST web服务:

@POST
@Path("savefile")
@Produces ({MediaType.TEXT_PLAIN})
public String createObjects(
        @FormDataParam("datafile") FormDataMultiPart file,
        @FormParam("username") String unm
        //@Context HttpServletRequest request
        ){....}
最初,我使用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>  

但是我总是从request.getParameter(“username”)获取null值。我不知道出了什么问题!!在多部分/表单数据表单中发送其他数据是否非法??我这里需要一些指针。请对此代码提出任何改进建议。

以下是适合我的解决方案。在多部分/formdata请求的情况下,可以使用部分中的输入流访问请求部分。我想向我的REST web服务发送一个字符串和一些文件。我在几个网站上找到了一个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();
    }
}
private static Logger=Logger.getLogger(“上传文件”);
@职位
@路径(“保存文件”)
public void createObjects(@Context-HttpServletRequest)
{
尝试
{
文件处理器f;
f=新文件处理程序(新文件(getClass().getResource(“/”+getClass().getName().substring(
0,getClass().getName().indexOf(“.”)).getPath().getParent().replaceAll(“\\\”,“\\\”+”/mylog.log”);
logger.addHandler(f);
}
捕获(安全异常e1)
{
logger.info(e1.getMessage());
}
捕获(IOE1异常)
{
logger.info(e1.getMessage());
}
ApplicationConstants.ROOTPATH=新文件(getClass().getResource(“/”+getClass().getName().substring(
0,getClass().getName().indexOf(“.”)).getPath().getParent().replaceAll(“\\\”,“\\”;
ApplicationConstants.ROOTPATH=ApplicationConstants.ROOTPATH.substring
(0,ApplicationConstants.ROOTPATH.indexOf(“\\”)+2);
字符串user=request.getParameter(“用户名”);
logger.info(“ApplicationConstants.ROOTPATH”+ApplicationConstants.ROOTPATH);
logger.info(“用户名”+用户);
尝试
{
for(部分:request.getParts())
{
logger.info(“part=“+part.getName());
如果(!part.getName().equalsIgnoreCase(“用户名”))
{
试一试{
BufferedInputStream in=新的BufferedInputStream(part.getInputStream());
字符串文件名=getFilename(部分);
布尔成功=(新文件(ApplicationConstants.ROOTPATH+user+“\\”).mkdir();
如果(成功){
System.out.println(“目录:“+ApplicationConstants.ROOTPATH+user.trim()+”\\\“+”已创建”);
}  
其他的
{
System.out.println(“未创建”);
}
FileOutputStream out=新的FileOutputStream(ApplicationConstants.ROOTPATH+user+“\\”+文件名);
字节[]数据=新字节[1000];
int字节读取=0;
整数偏移=0;
while(偏移量

希望这对别人有帮助

通过使用相关编程语言对问题进行标记,您可以更好地了解问题。通过RESTful 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();
    }
}