Невозможно загрузить файлы Bam на серверную часть flask (аргумент должен быть строкой, байтами или юникодом)Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Невозможно загрузить файлы Bam на серверную часть flask (аргумент должен быть строкой, байтами или юникодом)

Сообщение Anonymous »

Я уже некоторое время застрял в этой проблеме. Я пытаюсь загрузить файл BAM (размером от 0,7 до 2,3 ГБ) со своего веб-сайта через колбу в свою внутреннюю файловую систему. Я уже попробовал пару вещей. Я начал просто пытаться загрузить весь файл, и никто не удивился, мгновенно получая ошибки с ошибкой отключения. В некоторых сообщениях говорилось, что это может быть связано с таймаутами докера или пушки, поэтому я увеличил этот таймаут до 10 минут (просто чтобы убедиться, что это не проблема). После того, как по-прежнему появлялись ошибки по тайм-ауту, я попытался загрузить файлы частями, казалось, все прошло лучше, за исключением того, что он продолжает выдавать ошибку в одном из блоков, этот фрагмент никогда не бывает одинаковым, но всегда завершается последним блоком, заставляя меня думать, что так и должно быть. со слиянием кусков обратно. Я надеюсь, что новая пара тренированных глаз поможет мне здесь. Ниже приведены части кода, над которым я работаю, но, к сожалению, не самые чистые из-за того, что над этим проектом работает несколько стажеров:
HTML:


> Data Import

Изображение


Data upload


Select Data Type
Genomic elements
Read Counts
Splice Variants



Upload





Normal destribution


Log2 destribution


Log10 destribution



Splice Variants



Javascript:
document.addEventListener('DOMContentLoaded', function () {
document.getElementById("upload_button").addEventListener("click", function() {
event.preventDefault();
const uploadedFile = document.getElementById("uploaded_file").files[0];
const mode = document.getElementById("read_map_scale").value; // Get mode
const fileType = document.getElementById("file_type").value; // Get file type
var accessionCode = document.querySelector('#gi_codes').value.trim();

if (!uploadedFile) { alert("No file selected.");
return;
}
if (!mode || mode === "default") { alert("Please select a mode.");
return;
}

if (fileType === "genomic_positions") {
poscalc(uploadedFile, globalresults_json, accessionCode);
} else if (fileType === "read_map") {
// Track uploaded chunks
file_to_readdata(uploadedFile, mode, fileType);

} else if (fileType === "splice_variantes"){
alert("Work in progress not funcitonal yet");

} else{
alert("Invalid file type selected. (there is no functionality for this option yet)");
}
});
});

function file_to_readdata (uploadedFile) {
const chunkSize = 10 * 1024 * 1024; // 5 MB chunk size
const totalChunks = Math.ceil(uploadedFile.size / chunkSize);
let uploadedChunks = 0;
for (let i = 0; i < totalChunks; i++) {
const start = i * chunkSize;
const end = Math.min(start + chunkSize, uploadedFile.size);
const chunk = uploadedFile.slice(start, end);

console.log(`Uploading chunk ${i + 1}/${totalChunks}`);
console.log("Chunk size:", chunk.size);

const formData = new FormData();
formData.append("chunk", chunk);
formData.append("chunkIndex", i);
formData.append("totalChunks", totalChunks);
formData.append("fileName", uploadedFile.name);

fetch(`${$SCRIPT_ROOT}/_upload_file`, {
method: "POST",
body: formData,
})
.then((response) => response.json())
.then((data) => {
console.log(data);
if (data.status === "success") {
console.log(`Chunk ${i + 1}/${totalChunks} uploaded successfully`);
uploadedChunks++;

// Check if all chunks are uploaded
if (uploadedChunks === totalChunks) {
console.log("File upload complete");

}
} else {
console.error(`Error uploading chunk ${i + 1}:`, data.message);
}
})
.catch((error) => {
console.error("Error uploading chunk:", error);
});
}
}

Скрипт колбы:
@app.route('/_upload_file', methods=['GET', 'POST'])
def process_file():
"""
When the user uploads a bam or sam file, the file is processed, and the data is returned in a dictionary-like structure to the client.
"""
UPLOAD_DIR='../uploads'
try:
logging.debug("Request Files: %s", request.files)
logging.debug("Request Form: %s", request.form)

# Extract form data
chunk = request.files.get('chunk')
mode = request.form.get('mode')
chunk_index = int(request.form.get('chunkIndex', -1)) # Default -1 for debug
total_chunks = int(request.form.get('totalChunks', -1))
file_name = request.form.get('fileName')

logging.debug("Chunk: %s", chunk)
logging.debug("Mode: %s", mode)
logging.debug("Chunk Index: %d", chunk_index)
logging.debug("Total Chunks: %d", total_chunks)
logging.debug("File Name: %s", file_name)

# Create a temporary file to store chunks
temp_file_path = os.path.join(UPLOAD_DIR, f"{file_name}.part{chunk_index}")
chunk.save(temp_file_path)

# Check if all chunks are uploaded
uploaded_chunks = [f for f in os.listdir(UPLOAD_DIR) if f.startswith(file_name)]
if len(uploaded_chunks) == total_chunks:
# Combine chunks
complete_file_path = os.path.join(UPLOAD_DIR, file_name)
with open(complete_file_path, 'wb') as output_file:
for i in range(total_chunks):
part_path = os.path.join(UPLOAD_DIR, f"{file_name}.part{i}")
with open(part_path, 'rb') as part_file:
output_file.write(part_file.read())
os.remove(part_path) # Clean up chunk file
if rcg.is_valid_bam(output_file): # Use temp_file.name
sorted_bam = rcg.sort_and_index_bam(output_file) # Pass temp_file.name to your helper function
coverage = rcg.calculate_full_coverage(sorted_bam, mode)
else:
coverage = rcg.calculate_full_coverage(output_file, mode)
return jsonify({"status": "success", "message": "File uploaded successfully", "filePath": complete_file_path})

return jsonify({"status": "success", "message": "Chunk uploaded successfully"})

except Exception as ex:
return jsonify({"status": "error", "message": str(ex)}), 500

Ошибка:
Uploading chunk 72/73 handle_context_submission.js:296:17
Chunk size: 10485760 handle_context_submission.js:297:17
Uploading chunk 73/73 handle_context_submission.js:296:17
Chunk size: 2228747

POST http://0.0.0.0:443/_upload_file [HTTP/1.1 500 INTERNAL SERVER ERROR 4248ms]
Chunk 72/73 uploaded successfully handle_context_submission.js:313:29
Object { message: "Argument must be string, bytes or unicode.", status: "error" }
Error uploading chunk 73: Argument must be string, bytes or unicode.


Подробнее здесь: https://stackoverflow.com/questions/793 ... bytes-or-u
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»