FileRepresentation返回名称来自router.attach

时间:2015-04-26 12:38:18

标签: java restlet

这是一个奇怪的。我需要使用restlet api下载文件。我正在使用GET方法创建文件并返回FileRepresentation。下载工作正常,但文件名始终来自ApplicationRoot中指定的操作的名称。

这是我ApplicationRoot中的相关行:

router.attach("/LogDownload",LogDataDownload.class); 

LogDataDownload中的相关方法:

@Get
public Representation run() {

    APIResponseWrapper wrapper = new APIResponseWrapper(null, true);
    try{
        String fileLogPath = Config.getLogFilePath();
        File logFile = new File(fileLogPath);
        return FileUtility.createRepForFile(logFile);
    }catch(Exception e){
        wrapper.setErrorStackTrace(e);
    }
    return new JacksonRepresentation<APIResponseWrapper>(wrapper);
}

这就是我创建FileRepresentation

的方式
public static FileRepresentation createRepForFile(File file) {
    MimetypesFileTypeMap mimeTypesMap = new MimetypesFileTypeMap();
    String mimeTypeStr = mimeTypesMap.getContentType(file);
    MediaType mt = new MediaType(mimeTypeStr);
    FileRepresentation fr = new FileRepresentation(file, mt);
    fr.setDisposition(new Disposition(Disposition.TYPE_ATTACHMENT));
    return fr;
}

下载通过此网址正常运行:http://server:port/AppName/LogDownload

但下载的文件名始终为LoadDownload(或我在router.attach行中放置的任何内容),我无法将其重命名为我想要的内容,在本例中为{{ 1}}。

1 个答案:

答案 0 :(得分:2)

关键是要正确设置Disposition。这是完整的方法:

public static FileRepresentation createRepForFile(File file) {
    MimetypesFileTypeMap mimeTypesMap = new MimetypesFileTypeMap();
    String mimeTypeStr = mimeTypesMap.getContentType(file);
    MediaType mt = new MediaType(mimeTypeStr);
    FileRepresentation fr = new FileRepresentation(file, mt);

    Disposition disp = new Disposition(Disposition.TYPE_ATTACHMENT); 
    disp.setFilename(file.getName()); 
    disp.setSize(file.length()); 
    fr.setDisposition(disp); 

    return fr;
}