mirror of
https://github.com/discourse/discourse.git
synced 2025-05-22 07:53:49 +08:00
FEATURE: upload backups
This commit is contained in:
@ -2,7 +2,7 @@ require_dependency "backup_restore"
|
||||
|
||||
class Admin::BackupsController < Admin::AdminController
|
||||
|
||||
skip_before_filter :check_xhr, only: [:index, :show, :logs]
|
||||
skip_before_filter :check_xhr, only: [:index, :show, :logs, :check_chunk, :upload_chunk]
|
||||
|
||||
def index
|
||||
respond_to do |format|
|
||||
@ -83,4 +83,51 @@ class Admin::BackupsController < Admin::AdminController
|
||||
render nothing: true
|
||||
end
|
||||
|
||||
def check_chunk
|
||||
identifier = params.fetch(:resumableIdentifier)
|
||||
filename = params.fetch(:resumableFilename)
|
||||
chunk_number = params.fetch(:resumableChunkNumber)
|
||||
current_chunk_size = params.fetch(:resumableCurrentChunkSize).to_i
|
||||
|
||||
# path to chunk file
|
||||
chunk = Backup.chunk_path(identifier, filename, chunk_number)
|
||||
# check whether the chunk has already been uploaded
|
||||
has_chunk_been_uploaded = File.exists?(chunk) && File.size(chunk) == current_chunk_size
|
||||
# 200 = exists, 404 = not uploaded yet
|
||||
status = has_chunk_been_uploaded ? 200 : 404
|
||||
|
||||
render nothing: true, status: status
|
||||
end
|
||||
|
||||
def upload_chunk
|
||||
filename = params.fetch(:resumableFilename)
|
||||
return render nothing:true, status: 415 unless filename.to_s.end_with?(".tar.gz")
|
||||
|
||||
file = params.fetch(:file)
|
||||
identifier = params.fetch(:resumableIdentifier)
|
||||
chunk_number = params.fetch(:resumableChunkNumber).to_i
|
||||
chunk_size = params.fetch(:resumableChunkSize).to_i
|
||||
total_size = params.fetch(:resumableTotalSize).to_i
|
||||
current_chunk_size = params.fetch(:resumableCurrentChunkSize).to_i
|
||||
|
||||
# path to chunk file
|
||||
chunk = Backup.chunk_path(identifier, filename, chunk_number)
|
||||
dir = File.dirname(chunk)
|
||||
|
||||
# ensure directory exists
|
||||
FileUtils.mkdir_p(dir) unless Dir.exists?(dir)
|
||||
# save chunk to the directory
|
||||
File.open(chunk, "wb") { |f| f.write(file.tempfile.read) }
|
||||
|
||||
uploaded_file_size = chunk_number * chunk_size
|
||||
|
||||
# when all chunks are uploaded
|
||||
if uploaded_file_size + current_chunk_size >= total_size
|
||||
# merge all the chunks in a background thread
|
||||
Jobs.enqueue(:backup_chunks_merger, filename: filename, identifier: identifier, chunks: chunk_number)
|
||||
end
|
||||
|
||||
render nothing: true
|
||||
end
|
||||
|
||||
end
|
||||
|
Reference in New Issue
Block a user