staticFiles method
Route
staticFiles(
- String path,
- dynamic directory, {
- Map<
String, String> ? pathRegEx, - int statusCode = 200,
- String? mimeType,
- String? charset = kDefaultCharset,
- ResponseProcessor? responseProcessor,
- bool stripPrefix = true,
- Future<
Response> directoryLister(- Directory directory
- Iterable<
String? Function(File)> ? mimeTypeDetectors,
Serves requests for static files at path
from directory
stripPrefix
parameter determines if the matched part of the path shall be
discarded while locating the target file.
When stripPrefix
is true, the behaviour is similar to 'alias' in Nginx.
With path
'/static/*', the target file will be located inside directory
in the following way:
/static/html/index.html -> html/index.html
When stripPrefix
is false, the behavior is similar to 'root' in Nginx.
With path
'/static/*', the target file will be located inside directory
in the following way:
/static/html/index.html -> static/html/index.html
Example: final server = Jaguar(); server.staticFiles('/static/*', 'static'); await server.serve();
Implementation
Route staticFiles(String path, directory,
{Map<String, String>? pathRegEx,
int statusCode = 200,
String? mimeType,
String? charset = kDefaultCharset,
ResponseProcessor? responseProcessor,
bool stripPrefix = true,
Future<Response> directoryLister(Directory directory)?,
Iterable<String? Function(File)>? mimeTypeDetectors}) {
if (directory is String) directory = Directory(directory);
final Directory dir = directory;
if (!dir.existsSync())
throw Exception('Directory ${dir.path} does not exist!');
int skipCount = 0;
Route route = this.get(path, (ctx) async {
Iterable<String> segs = ctx.pathSegments;
if (stripPrefix) segs = segs.skip(skipCount);
String path = p.join(dir.path, p.joinAll(segs));
var file = File(path);
if (!await file.exists()) {
final fileDir = Directory(path);
if (!await fileDir.exists()) return Response(statusCode: 404);
path = p.join(path, 'index.html');
file = File(path);
if (!await file.exists()) {
if (directoryLister != null) return directoryLister(fileDir);
return Response(statusCode: 404);
}
}
return StreamResponse(
body: await file.openRead(),
mimeType: MimeTypes.ofFile(file, detectors: mimeTypeDetectors));
},
pathRegEx: pathRegEx,
statusCode: statusCode,
mimeType: mimeType,
charset: charset,
responseProcessor: responseProcessor);
if (stripPrefix) {
if (route.pathSegments.isNotEmpty) {
skipCount = route.pathSegments.length - 1;
}
}
return route;
}