<script> socket = new WebSocket("ws://127.0.0.1:8000/room/123/"); {##} socket.onmessage = function (event) { let tag = document.createElement("div") tag.innerText = event.data document.getElementById("message").appendChild(tag); } function sendMessage(data) { {#const fileInput = form.file.value;#} const fileInput = document.getElementById("file"); {#const radioInput = form.check.value;#} const radioInput = document.getElementsByName('check') //添加事件 fileInput.addEventListener('change', (event) => { const file = event.target.files[0]; console.log(file) const reader = new FileReader(); reader.onload = (event) => { const fileData = event.target.result; const selectedValue = Array.from(radioInput).find(input => input.checked).value; const data = { option: selectedValue, file: fileData, } console.log("开始传") console.log(selectedValue) console.log(fileData) //将数据传给socket socket.send(JSON.stringify(data)); }; reader.readAsArrayBuffer(file); }); } </script>class ChatConsumer(WebsocketConsumer): def websocket_connect(self, message): # 接收客户端请求 self.accept() self.send("连接") def websocket_receive(self, event, ): # self.send() print(event) self.send("已收到") data = json.loads(event['text']) print(data) check = data.get('option') print(check) file_data = data.get('excelFile') file_data_bytes = json.dumps(file_data).encode() print(file_data) # file_stream = io.BytesIO(file_data.encode()) with open('received_file.xlsx', 'wb') as file: file.write(file_data_bytes) file.close() self.send('正在打开数据...') # df = pd.read_excel('received_file.xlsx',engine='openpyxl') df = pd.read_excel(file_data) 在传输过程中excel文件损坏,是哪里有问题?并且怎么修改代码可以让只有都选中文件和单选才能进行提交,并且都选中提交后才能出现弹窗
时间: 2024-04-16 20:27:47 浏览: 230
利用WebSocket完成数据通讯
从您的代码中,我可以看到您在前端使用WebSocket与后端进行通信,并在后端使用Django的WebsocketConsumer处理来自前端的消息。
关于您的问题,首先,如果在传输过程中Excel文件损坏,可能是数据在传输过程中发生了错误。您可以在前端和后端的WebSocket通信过程中添加错误处理,以便在损坏的情况下进行处理。
其次,为了实现只有当文件和单选都被选中时才能提交,并且在两者都被选中时才显示弹窗,您可以通过以下方式修改代码:
1. 前端部分:
- 在`sendMessage`函数中,添加逻辑以检查文件和单选是否都被选中。
- 可以使用`fileInput.files.length`来检查文件是否被选中,如果为0,则表示没有选择文件。
- 对于单选按钮,您可以使用`Array.from(radioInput).some(input => input.checked)`来检查是否至少有一个单选按钮被选中。
2. 后端部分:
- 在`websocket_receive`方法中,添加逻辑以处理只有当文件和单选都被选中时才显示弹窗。
- 您可以使用`if`语句来检查`check`和`file_data`是否存在,并根据条件发送相应的消息给前端。
下面是修改后的代码示例:
```html
<script>
socket = new WebSocket("ws://127.0.0.1:8000/room/123/");
socket.onmessage = function (event) {
let tag = document.createElement("div")
tag.innerText = event.data
document.getElementById("message").appendChild(tag);
}
function sendMessage() {
const fileInput = document.getElementById("file");
const radioInput = document.getElementsByName('check');
if (fileInput.files.length > 0 && Array.from(radioInput).some(input => input.checked)) {
const file = fileInput.files[0];
const reader = new FileReader();
reader.onload = (event) => {
const fileData = event.target.result;
const selectedValue = Array.from(radioInput).find(input => input.checked).value;
const data = {
option: selectedValue,
file: fileData,
}
socket.send(JSON.stringify(data));
};
reader.readAsArrayBuffer(file);
} else {
// 显示提示信息,要求选择文件和单选
alert("请选择文件并选择单选!");
}
}
</script>
```
```python
class ChatConsumer(WebsocketConsumer):
def websocket_connect(self, message):
self.accept()
self.send("连接")
def websocket_receive(self, event):
self.send("已收到")
data = json.loads(event['text'])
check = data.get('option')
file_data = data.get('file')
if check and file_data:
file_data_bytes = json.dumps(file_data).encode()
with open('received_file.xlsx', 'wb') as file:
file.write(file_data_bytes)
file.close()
self.send('正在打开数据...')
# df = pd.read_excel('received_file.xlsx', engine='openpyxl')
df = pd.read_excel(file_data)
# 显示弹窗
self.send('显示弹窗')
else:
# 发送错误消息给前端
self.send('文件和单选都需要被选中!')
```
请注意,以上代码示例仅提供了一个可能的解决方案,您可以根据您的具体需求进行修改和调整。另外,为了确保文件传输的完整性和正确性,建议在实际应用中使用更可靠和安全的文件传输方法,如使用HTTP上传文件或使用专门的文件传输协议。
阅读全文