这里我的要求是上传文件并将其存储在磁盘中。我将它存储在磁盘中没有问题,但获取文件的扩展名。问题是当我点击上传并处理要存储在磁盘中的文件时,它会被保存为具有以下名称的临时文件
“/ TMP / multipartBody6238081076014199817asTemporaryFile”
这里的文件没有扩展名。因此,以下任何库都无法帮助我获取文件的扩展名。
FileNameUtils.getExtension()
or
Files.getFileExtension(path)
我甚至尝试通过它的属性来获取它,但它没有获取文件扩展名的选项。
Path path = Paths.get("/**/**/filepath");
BasicFileAttributes attr = Files.readAttributes(path, BasicFileAttributes.class);
HTML code:
<input type="file" name="fileInput" class="filestyle" data-classIcon="icon-plus" data-classButton="btn btn-primary" >
从Play框架中获取文件对象:
MultipartFormData body = request().body().asMultipartFormData();
FilePart fileInput = body.getFile("fileInput");
File file = fileInput.getFile();
我们非常感谢您提取文件扩展名的任何帮助。
谢谢,
答案 0 :(得分:2)
我在客户端使用Jquery fileupload。
在我的JS文件中,
function doUploadPhoto(seq) {
$('#fileupload').fileupload({
url : 'news/upload.html?s=' + seq,
sequentialUploads : true,
disableImageResize : false,
imageMaxWidth : 1024,
imageMaxHeight : 1024,
previewCrop : true,
dropZone : $("#dropZone"),
acceptFileTypes : /(\.|\/)(gif|jpe?g|png)$/i,
progress : function(e, data) {
if (data.context) {
var progress = data.loaded / data.total * 100;
progress = Math.floor(progress);
$('.progress').attr('aria-valuenow', progress);
$('.progress').css('display', 'block');
$('.bar').css('width', progress + '%');
}
},
progressall : function(e, data) {
var progress = data.loaded / data.total * 100;
progress = Math.floor(progress);
$('.progressall').attr('aria-valuenow', progress);
$('.progressall').css('display', 'block');
$('.allbar').css('width', progress + '%');
if (progress > 20) {
$('.allbar').text(progress + '% Completed');
}
},
stop: function (e) {
return;
}
});
}
处理您对图片上传的具体要求(我使用的是Spring)。
@RequestMapping(value = "/news/upload.html", method = RequestMethod.POST)
public final void uploadNewsPhoto(final HttpServletRequest request, final HttpServletResponse response)
throws Exception {
doUploadNewsPhoto(request, getSessionFileItems(request));
}
上传图片
public final synchronized String doUploadNewsPhoto(final HttpServletRequest request,
final List<FileItem> sessionFiles) throws UploadActionException {
try {
List<Map<String, Object>> ret = new ArrayList<Map<String, Object>>();
for (FileItem item : sessionFiles) {
if (!item.isFormField()) {
try {
// get news sequence for save it's images
Long seq = Long.parseLong(request.getParameter("s"));
Map<String, Object> res = newsPhotoBiz.saveToFile(seq, item, SecuritySession.getLoginUserSeq());
res.put("name", item.getName());
res.put("size", item.getSize());
ret.add(res);
}
catch (Exception e) {
log.error("Error, can't upload news photo file, name:" + item.getName(), e);
}
}
}
// Remove files from session because we have a copy of them
removeSessionFileItems(request);
Map<String, Object> json = new HashMap<String, Object>();
json.put("files", ret);
JSONObject obj = (JSONObject) JSONSerializer.toJSON(json);
// return to client side about uploaded images info
return obj.toString();
}
catch (Exception e) {
log.error("Error, when upload news photo file", e);
throw new UploadActionException(e);
}
}
用于保存图片
public final Map<String, Object> saveToFile(final Long newsSeq, final FileItem item, final Long loginUserSeq)
throws BusinessException {
String staticDir = System.getProperty("staticDir");
Date today = new Date();
SimpleDateFormat fmtYMD = new SimpleDateFormat("/yyyyMMdd");
SimpleDateFormat fmtHMS = new SimpleDateFormat("HHmmssS");
String saveDir = "data/news" + fmtYMD.format(today);
String format = ".jpg";
try {
format = item.getName().substring(item.getName().lastIndexOf("."), item.getName().length());
}
catch (Exception e) {
format = ".jpg";
}
try {
String fileName = newsSeq + "_" + fmtHMS.format(today) + format;
NewsPhotoBean bean = new NewsPhotoBean();
bean.setNewsSeq(newsSeq);
bean.setFile(saveDir + "/" + fileName);
// save image infos in database and return it's sequence
Long photoSeq = newsPhotoService.add(bean, loginUserSeq);
// Save image in specify location
String filePath = staticDir + "/" + saveDir;
FileSupport.saveFile(filePath, fileName, item);
Map<String, Object> ret = new HashMap<String, Object>();
ret.put("seq", newsSeq);
ret.put("photoSeq", photoSeq);
ret.put("path", saveDir + "/" + fileName);
ret.put("ext", format.substring(1));
//client side may need uploaded images info
return ret;
}
catch (Exception e) {
throw new BusinessException("Error occur when save file. newsSeq : " + newsSeq, e);
}
}
用于写图像
// Save Image by FileItem that gets from Image Upload
public static String saveFile(final String filePath, final String fileName, final FileItem item) throws Exception {
File file = new File(filePath);
file.setExecutable(true, false);
file.setWritable(true, false);
if (!file.exists()) {
file.mkdirs();
}
File imageFile = new File(file, fileName);
item.write(imageFile);
item.setFieldName(filePath + fileName);
return item.toString();
}
答案 1 :(得分:2)
我找到了解决方法。实际上这是Play框架。我使用以下代码获取了该文件。
MultipartFormData body = request().body().asMultipartFormData();
FilePart fileInput = body.getFile("fileInput");
File file = fileInput.getFile();
我尝试使用此文件对象(用于存储在 tmp 位置)获取文件名。但我没想到 FilePart 对象包含上传的所有文件详细信息。然后我想通了。
fileInput.getFilename()
为我提供了带扩展名的上传文件名。它解决了我的问题。
感谢 Cataclysm 帮助我。当然,他给出的那个是Struts / Spring或核心servlet等其他框架的最佳答案。
答案 2 :(得分:1)
这对我有用
Part filePart = request.getPart("input-file");
String type=filePart.getContentType();
type="."+type.substring(type.lastIndexOf("/")+1);
答案 3 :(得分:0)
要从Servlet上传中获取文件的扩展名,您的表单enctype应该为“ multipart / form-data” 上传表格示例:
<form action="CheatQuizUpload" method="POST" target="miao" enctype="multipart/form-data">
Upload your file<br>
<input required type="file" name="file">
<button type="submit" class="btn btn-success">Submit</button>
<br>
</form>
在服务器端,文件的参数名称将与输入的“名称”属性相对应。
//...other request handling code
Part filePart = request.getPart("file");/*"name" attribute of your input*/
String fileName = filePart.getSubmittedFileName();//full name of file submitted
String[] fileNameSplit = fileName.split(".");//split between name and extension
String extension = fileNameSplit[fileNameSplit.length-1];//get the extension part of the file name