使用REST上传多个文件
问题描述:
我在我的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为空值(“用户名”)。我不知道什么是错的!以多部分/形式 - 数据形式发送其他数据是否违法?我需要一些指针。请在此代码中提出任何改进建议。
答
以下是适合我的解决方案。可以使用零件中的输入流来访问多部分/ 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();
}
}
希望这可以帮助别人!
您可以通过相关的编程语言 – JohnP
一个标记它为你的问题更好的可视性非常好的例子(客户端和服务器端代码)上传多个文件通过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