从上传的文件中获取文件扩展名

时间:2014-05-27 08:55:57

标签: java playframework apache-commons-fileupload

这里我的要求是上传文件并将其存储在磁盘中。我将它存储在磁盘中没有问题,但获取文件的扩展名。问题是当我点击上传并处理要存储在磁盘中的文件时,它会被保存为具有以下名称的临时文件

  

“/ 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();

我们非常感谢您提取文件扩展名的任何帮助。

谢谢,

4 个答案:

答案 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