Android应用内运行GO静态服务器访问本地图片返回404问题求助
问题原因
- 路径格式错误:
http.Dir()接收的是本地文件系统的原生绝对路径,不支持file://协议前缀,你传入带协议的路径会被当作普通字符串解析,系统找不到对应目录,自然返回404。 - 静态服务路径前缀匹配错误:直接将
/android/绑定到FileServer时,请求路径中的/android/部分会被保留作为查找文件的路径片段,也就是访问/android/myfile.jpg时,服务端会尝试在你指定的目录下查找android/myfile.jpg,而不是根目录下的myfile.jpg,路径匹配失败。 - Android权限未授予:如果App没有申请对应存储目录的读取权限,Go运行时没有权限读取媒体目录下的文件,也会返回404错误。
解决方案
- 移除路径的
file://前缀,直接传入原生绝对路径 - 使用
http.StripPrefix去掉请求路径中的/android/前缀,保证FileServer查找文件时路径正确 - 检查并申请Android存储读取权限:
- Android 13及以上版本需要在
AndroidManifest.xml中声明android.permission.READ_MEDIA_IMAGES权限,同时完成动态权限申请 - Android 12及以下版本需要声明
android.permission.READ_EXTERNAL_STORAGE权限并完成动态权限申请
- Android 13及以上版本需要在
修改后的完整代码如下:
fsAndroid := http.FileServer(http.Dir("/storage/emulated/0/Android/media/com.myapp/")) http.Handle("/android/", http.StripPrefix("/android/", fsAndroid)) go func() { log.Println(http.ListenAndServe("127.0.0.1:6060", nil)) <-c }()
如果修改后仍存在问题,可以在服务启动阶段加日志打印目标目录的文件列表,确认路径正确性和读取权限正常。
内容的提问来源于stack exchange,提问作者Hasan A Yousef
相关产品推荐
相关产品推荐

