Skip to content

Commit d2b8ed3

Browse files
committed
frist commit
0 parents  commit d2b8ed3

4 files changed

Lines changed: 224 additions & 0 deletions

File tree

LICENSE

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
MIT License
2+
3+
Copyright (c) 2024 oop7
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in all
13+
copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
SOFTWARE.

Run.bat

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
@echo off
2+
python "%~dp0main.py"
3+
pause

main.py

Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
import sys
2+
import os
3+
import qrcode
4+
import base64
5+
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QLabel
6+
from PyQt5.QtGui import QPixmap, QIcon
7+
from flask import Flask, request, send_from_directory, render_template_string
8+
import threading
9+
import socket
10+
11+
# Flask app
12+
flask_app = Flask(__name__)
13+
14+
# Folder to save uploaded files
15+
UPLOAD_FOLDER = 'uploads'
16+
if not os.path.exists(UPLOAD_FOLDER):
17+
os.makedirs(UPLOAD_FOLDER)
18+
19+
BASE64_IMAGE = "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" # Replace with your actual Base64 image string
20+
21+
def get_pixmap_from_base64(base64_string):
22+
image_data = base64.b64decode(base64_string)
23+
pixmap = QPixmap()
24+
pixmap.loadFromData(image_data)
25+
return pixmap
26+
27+
HTML_TEMPLATE = '''
28+
<!DOCTYPE html>
29+
<html lang="en">
30+
<head>
31+
<meta charset="UTF-8">
32+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
33+
<title>WebShare</title>
34+
<link rel="icon" href="data:image/png;base64,{image}" type="image/png">
35+
<style>
36+
body {{
37+
background-color: #11171d;
38+
color: white;
39+
font-family: Arial, sans-serif;
40+
}}
41+
img {{
42+
display: block;
43+
margin: 0 auto;
44+
max-width: 150px;
45+
padding-top: 20px;
46+
}}
47+
h1, h2 {{
48+
text-align: center;
49+
}}
50+
form {{
51+
text-align: center;
52+
margin-bottom: 20px;
53+
}}
54+
input[type="submit"] {{
55+
background-color: #ffffff;
56+
color: #11171d;
57+
padding: 10px;
58+
border: none;
59+
cursor: pointer;
60+
}}
61+
a {{
62+
color: white;
63+
}}
64+
</style>
65+
</head>
66+
<body>
67+
<img src="data:image/png;base64,{image}" alt="Logo">
68+
<h1>File Sharing</h1>
69+
<form method="POST" enctype="multipart/form-data">
70+
<input type="file" name="file" style="margin-bottom: 10px;">
71+
<input type="submit" value="Upload">
72+
</form>
73+
<h2>Files:</h2>
74+
<ul>
75+
{{% for filename in files %}}
76+
<li><a href="{{{{ url_for('download_file', filename=filename) }}}}">{{{{ filename }}}}</a></li>
77+
{{% endfor %}}
78+
</ul>
79+
</body>
80+
</html>
81+
'''.format(image=BASE64_IMAGE)
82+
83+
@flask_app.route('/', methods=['GET', 'POST'])
84+
def index():
85+
if request.method == 'POST':
86+
file = request.files['file']
87+
if file:
88+
file.save(os.path.join(UPLOAD_FOLDER, file.filename))
89+
files = os.listdir(UPLOAD_FOLDER)
90+
return render_template_string(HTML_TEMPLATE, files=files)
91+
92+
@flask_app.route('/uploads/<filename>')
93+
def download_file(filename):
94+
return send_from_directory(UPLOAD_FOLDER, filename)
95+
96+
def get_local_ip():
97+
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
98+
s.settimeout(0)
99+
try:
100+
s.connect(('10.254.254.254', 1))
101+
IP = s.getsockname()[0]
102+
except Exception:
103+
IP = '127.0.0.1'
104+
finally:
105+
s.close()
106+
return IP
107+
108+
def run_flask():
109+
flask_app.run(host='0.0.0.0', port=5000)
110+
111+
class WebShareApp(QWidget):
112+
def __init__(self):
113+
super().__init__()
114+
self.initUI()
115+
116+
def initUI(self):
117+
self.setWindowTitle("WebShare for Windows")
118+
119+
# Set window icon
120+
self.setWindowIcon(QIcon(get_pixmap_from_base64(BASE64_IMAGE)))
121+
122+
layout = QVBoxLayout()
123+
124+
# Apply dark mode stylesheet
125+
self.setStyleSheet("""
126+
QWidget {
127+
background-color: #11171d;
128+
color: white;
129+
font-family: Arial, sans-serif;
130+
}
131+
QPushButton {
132+
background-color: #444;
133+
color: white;
134+
padding: 10px;
135+
border: none;
136+
border-radius: 5px;
137+
}
138+
QPushButton:hover {
139+
background-color: #555;
140+
}
141+
QLabel {
142+
margin: 10px;
143+
}
144+
""")
145+
146+
# Start Server Button
147+
self.start_button = QPushButton("Start WebShare Server", self)
148+
self.start_button.clicked.connect(self.start_server)
149+
layout.addWidget(self.start_button)
150+
151+
# QR Code Display
152+
self.qr_label = QLabel(self)
153+
layout.addWidget(self.qr_label)
154+
155+
# Open Folder Button
156+
self.open_folder_button = QPushButton("Open Upload Folder", self)
157+
self.open_folder_button.clicked.connect(self.open_folder)
158+
layout.addWidget(self.open_folder_button)
159+
160+
self.setLayout(layout)
161+
162+
def start_server(self):
163+
local_ip = get_local_ip()
164+
url = f'http://{local_ip}:5000'
165+
self.generate_qr(url)
166+
167+
# Run Flask server in a separate thread
168+
threading.Thread(target=run_flask, daemon=True).start()
169+
self.start_button.setText(f"Server running at {url}")
170+
171+
def generate_qr(self, data):
172+
qr = qrcode.QRCode(
173+
version=1,
174+
error_correction=qrcode.constants.ERROR_CORRECT_L,
175+
box_size=10,
176+
border=4,
177+
)
178+
qr.add_data(data)
179+
qr.make(fit=True)
180+
181+
img = qr.make_image(fill='black', back_color='white')
182+
img.save('qr_code.png')
183+
184+
pixmap = QPixmap('qr_code.png')
185+
self.qr_label.setPixmap(pixmap)
186+
187+
def open_folder(self):
188+
folder_path = os.path.abspath(UPLOAD_FOLDER)
189+
os.startfile(folder_path)
190+
191+
# Main function
192+
if __name__ == '__main__':
193+
qt_app = QApplication(sys.argv)
194+
webshare = WebShareApp()
195+
webshare.show()
196+
sys.exit(qt_app.exec_())

requirements.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
qrcode[pil]
2+
PyQt5
3+
flask
4+

0 commit comments

Comments
 (0)