我正在使用jboss的rest-easy multipart提供程序来导入文件。我在这里阅读http://docs.jboss.org/resteasy/docs/1.0.0.GA/userguide/html/Content_Marshalling_Providers.html#multipartform_annotation关于@MultipartForm,因为我可以用我的POJO准确地映射它。
以下是我的POJO
public class SoftwarePackageForm {
@FormParam("softwarePackage")
private File file;
private String contentDisposition;
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public String getContentDisposition() {
return contentDisposition;
}
public void setContentDisposition(String contentDisposition) {
this.contentDisposition = contentDisposition;
}
}
然后我得到了文件对象并打印了它的绝对路径,它返回了一个类型为file的文件名。扩展名和上传的文件名将丢失。我的客户端正在尝试上传档案文件(zip,tar,z)
我需要在服务器端提供此信息,以便我可以正确应用un-archive程序。
原始文件名以content-disposition标头发送到服务器。
如何获取此信息?或至少如何说jboss用上传的文件名和扩展名保存文件?它可以从我的应用程序配置吗?
答案 0 :(得分:13)
在查看包含此one的Resteasy示例之后,在使用带有@MultipartForm
注释的POJO类时,似乎无法检索原始文件名和扩展名信息。
到目前为止,我看到的示例通过HTTP POST从提交的多部分表单数据的“文件”部分的Content-Disposition
标题中检索文件名,其实质上类似于:
Content-Disposition: form-data; name="file"; filename="your_file.zip"
Content-Type: application/zip
您必须更新文件上传REST服务类以提取此标头,如下所示:
@POST
@Path("/upload")
@Consumes("multipart/form-data")
public Response uploadFile(MultipartFormDataInput input) {
String fileName = "";
Map<String, List<InputPart>> formParts = input.getFormDataMap();
List<InputPart> inPart = formParts.get("file"); // "file" should match the name attribute of your HTML file input
for (InputPart inputPart : inPart) {
try {
// Retrieve headers, read the Content-Disposition header to obtain the original name of the file
MultivaluedMap<String, String> headers = inputPart.getHeaders();
String[] contentDispositionHeader = headers.getFirst("Content-Disposition").split(";");
for (String name : contentDispositionHeader) {
if ((name.trim().startsWith("filename"))) {
String[] tmp = name.split("=");
fileName = tmp[1].trim().replaceAll("\"","");
}
}
// Handle the body of that part with an InputStream
InputStream istream = inputPart.getBody(InputStream.class,null);
/* ..etc.. */
}
catch (IOException e) {
e.printStackTrace();
}
}
String msgOutput = "Successfully uploaded file " + filename;
return Response.status(200).entity(msgOutput).build();
}
希望这有帮助。
答案 1 :(得分:2)
您可以使用@PartFilename但不幸的是,目前这只用于撰写表单,而不是阅读表单:RESTEASY-1069。
直到此问题得到解决,您可以使用MultipartFormDataInput
作为资源方法的参数。
答案 2 :(得分:0)
似乎Isim是对的,但有一种解决方法。
在表单中创建一个隐藏字段,并使用所选文件的名称更新其值。提交表单时,文件名将作为@FormParam提交。
以下是您可能需要的一些代码(需要jquery)。
<input id="the-file" type="file" name="file">
<input id="the-filename" type="hidden" name="filename">
<script>
$('#the-file').on('change', function(e) {
var filename = $(this).val();
var lastIndex = filename.lastIndexOf('\\');
if (lastIndex < 0) {
lastIndex = filename.lastIndexOf('/');
}
if (lastIndex >= 0) {
filename = filename.substring(lastIndex + 1);
}
$('#the-filename').val(filename);
});
</script>
答案 3 :(得分:0)
如果您使用 MultipartFile 类,那么您可以执行以下操作:
MultipartFile multipartFile;
multipartFile.getOriginalFilename();