В моем html-файле есть тег input type = file, который позволяет пользователю выбирать несколько файлов.Действие для формы - это веб-служба 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>
Я не уверен, какой должен быть тип параметра файла, чтобы разрешить в нем несколько файлов ????Либо параметр file дает мне несколько файлов ИЛИ мне нужно вернуться обратно к инъекции @Context ??Если да, то как мне получить строковый параметр?
Любая помощь приветствуется!
РЕДАКТИРОВАТЬ: я изменил мой REST 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 ("username") как ноль.Я не знаю, что идет не так !!Незаконно ли отправлять и другие данные в виде нескольких частей / данных формы?Мне нужны некоторые указатели здесь.Пожалуйста, предложите какие-либо улучшения в этом коде.