这是一个奇怪的。我需要使用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}}。
答案 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;
}