Feat: gcode download

This commit is contained in:
Gangoke
2026-05-24 16:28:49 -10:00
parent 206babfa2e
commit 69c929f5b2
2 changed files with 27 additions and 0 deletions

View File

@@ -1514,6 +1514,19 @@ class KobraXBridge:
return self._json_cors({"result": "ok"})
return self._json_cors({"error": "not found"}, status=404)
async def handle_kx_file_download(self, request):
file_id = request.match_info["file_id"]
f = self._store.get_file(file_id)
if not f:
return self._json_cors({"error": "not found"}, status=404)
path = f.get("path") or ""
if not path or not os.path.isfile(path):
return self._json_cors({"error": "not found"}, status=404)
filename = os.path.basename(f.get("filename") or path)
return web.FileResponse(path, headers={
"Content-Disposition": f'attachment; filename="{filename}"'
})
async def handle_kx_file_verify(self, request):
file_id = request.match_info["file_id"]
if self._store.clear_web_unverified(file_id):
@@ -3483,6 +3496,7 @@ def build_app(bridge: KobraXBridge) -> web.Application:
r.add_post("/kx/print", bridge.handle_kx_print)
r.add_get("/kx/files", bridge.handle_kx_files)
r.add_delete("/kx/files/{file_id}", bridge.handle_kx_file_delete)
r.add_get("/kx/files/{file_id}/download", bridge.handle_kx_file_download)
r.add_post("/kx/files/{file_id}/verify", bridge.handle_kx_file_verify)
r.add_get("/kx/filament/slots", bridge.handle_kx_filament_slots)
r.add_get("/kx/history", bridge.handle_kx_history)

View File

@@ -146,6 +146,7 @@ var LANG_DE={
store_empty:'Noch keine Dateien hochgeladen.',
store_refresh:'↻ Aktualisieren',
store_print:'▶ Drucken',
store_download:'⬇ Download',
store_delete_confirm:'Datei löschen?',
store_print_confirm:'Datei drucken?',
store_web_verify_title:'Datei verifizieren',
@@ -214,6 +215,7 @@ var LANG_EN={
store_empty:'No files uploaded yet.',
store_refresh:'↻ Refresh',
store_print:'▶ Print',
store_download:'⬇ Download',
store_delete_confirm:'Delete file?',
store_print_confirm:'Print file?',
store_web_verify_title:'Verify file',
@@ -1663,6 +1665,8 @@ function renderStore(){
'<div style="display:flex;gap:6px;margin-top:auto">'+
'<button onclick="storePrint(\''+f.id+'\',\''+f.filename.replace(/'/g,"\\'")+'\')" '+
'style="flex:1;font-size:12px;padding:5px;background:var(--accent);color:#fff;border:none;border-radius:6px;cursor:pointer">'+T.store_print+'</button>'+
'<button onclick="storeDownload(\''+f.id+'\')" title="'+T.store_download+'" '+
'style="font-size:12px;padding:5px 8px;background:var(--raised);border:1px solid var(--border);border-radius:6px;color:var(--txt2);cursor:pointer">⬇</button>'+
'<button onclick="storeDelete(\''+f.id+'\')" '+
'style="font-size:12px;padding:5px 8px;background:var(--raised);border:1px solid var(--border);border-radius:6px;color:var(--txt2);cursor:pointer">🗑</button>'+
'</div>'+
@@ -2239,6 +2243,15 @@ function storeDelete(fileId){
});
}
function storeDownload(fileId){
var a=document.createElement('a');
a.href=_apiUrl('/kx/files/'+encodeURIComponent(fileId)+'/download');
a.style.display='none';
document.body.appendChild(a);
a.click();
a.remove();
}
// ── Drucker hinzufügen ──
function openAddPrinterDialog(){
document.getElementById('apd-ip').value='';