LTM đến LTW, sai lầm về lưu file base64 cũng như ăn hành sml về ghi file string không qua encode
(Bài viết hoàn toàn mang tính chủ quan của tác giả, bạn có thể đọc, bình luận và ném đá nhưng hãy thực hiện các hành động đó với thái...
(Bài viết hoàn toàn mang tính chủ quan của tác giả, bạn có thể đọc, bình luận và ném đá nhưng hãy thực hiện các hành động đó với thái độ tôn trọng bản thân cũng như tôn trọng tác giả)
Sau phần 1: "LTM - Câu hỏi về lưu file trên server directory hay database with blob của Mr.Tính?", tiếp đến là những bước đầu tiên từ suy nghĩ đến code và ứng dụng thực tiễn, loạt bài của mình chia làm 3 và phần này là phần thứ 2.
Như đã đề cập ở phần trước, một thuật toán đơn giản để lưu một file, tệp đính kèm dạng nhị phân vào database, đồng thời tạo ra sự tương thích khi export data ra sql script có thể chạy được trên nhiều csdl khác nhau được diễn tả lại như sau: nguồn file -> mảng byte -> encoder -> string -> write to database with string column.
Nếu sơ qua về thuật toán trên thì với một chút kiến thức về thao tác đọc/ ghi file, đồng thời chút kinh nghiệm của người mới làm quen về sql, thao tác csdl thông qua code thì hoàn toàn là một việc dễ dàng và không thể nào dẫn đến một sai lầm cụ thể nào.
Sau đây là phần hiện thực thuật toán trên bằng mã Java:
Bước 1: xác định nguồn file, bắt đầu quá trình đọc vào mảng byte(thông thường hình ảnh và tệp đính kèm trên website nhỏ không quá 80MB nên quá trình này có thể thoải mái thao tác)
Giải thích một chút về đôi dòng code của mình, mình cast từ long về int vì lý do mình chắc chắn đươc quyền kiểm soát đầu vào là file hoặc tệp đính kèm có dung lượng luôn bé hơn 80MB.
Bước 2: cho mảng byte qua base64 endcoder(mình sử dụng encoder dựng sẵn của java)
Bước 3: nhận một string sau khi encode và bắt đầu quá trình ghi vào database
Và đây là kết quả trong database:
Rất đơn giản và nhẹ nhàng.
Như đã đề cập ở bài trước, quá trình còn lại là chuyển đổi từ đoạn text trở ngược về dạng mảng byte chỉ cần đi qua base64 decoder.
Như vậy là quá trình lưu, đọc file thông qua base64 kết thúc. Mình xin đề cập về sai lầm của mình và nhóm như title
Mô tả ngắn ngọn: do lúc googling về cách sử dụng base64 để lưu và xuất file, cũng như muốn đưa nó vào bài tập lớn môn web, mình tạo 1 controller export image mà event export được fired bởi , bọn mình đã mắc một sai lầm cực kì nghiêm trọng và dẫn đến hậu quả không thể lường trước được đó là:
"thẻ img có thể sử dụng được đoạn string base64 trực tiếp thay vì bắt buộc là sử dụng controller export hoàn toàn ra mảng byte đồng thời xác định media type rồi ghi vào response" từ đó dẫn đến cùng một uri xác định 1 tài nguyên nhưng browser request > 1 lần, đồng thời do encode mà dung lượng truyền tải của file tăng lên 25%, sự trùng lặp dữ liệu tăng lên làm cho website của mình chạy rất chậm, đồng thời phía server cũng bị ngốn băng thông rất nhiều, cpu và ram tăng cao.
Một vấn đề khác mình còn gặp phải là browser không cache lại file giống như khi chúng ta lưu file ở server's directories.
Vì vậy ở bài sau, mình sẽ viết về cách xử lý 2 vấn đề trên, cũng như quá trình tìm hiều về HTTP caching và cách mình đã hiện thực thành công HTTP caching ở phía server, đồng thời làm chủ được cache ở phía client's browser như thế nào!
Chuyện trò - Tâm sự
/chuyen-tro-tam-su
Bài viết nổi bật khác
- Hot nhất
- Mới nhất