Chuyển tệp sang Base64 online: kết quả là data URI, dùng vào đâu và khi nào không nên dùng
Công cụ đọc một tệp bất kỳ ngay trên máy bạn rồi mã hóa thành chuỗi Base64 kèm tiền tố data URI đầy đủ, dán được thẳng vào thuộc tính src của thẻ ảnh, vào thuộc tính url trong CSS hay vào một trường JSON. Kèm theo là tên tệp, kiểu MIME mà trình duyệt nhận diện, độ dài chuỗi và kích thước ước tính.
Tính năng nổi bật
- Nhận mọi định dạng tệp: ảnh, PDF, tài liệu văn phòng, phông chữ, tệp nén, tệp âm thanh
- Kết quả là chuỗi data URI hoàn chỉnh gồm phần khai báo kiểu MIME, từ khóa base64 và phần dữ liệu
- Hiển thị tên tệp và kiểu MIME do trình duyệt tự nhận diện để bạn kiểm tra trước khi dùng
- Đếm số ký tự của chuỗi kết quả và ước tính dung lượng tương ứng theo kilobyte
- Nút sao chép toàn bộ chuỗi vào bộ nhớ tạm chỉ với một lần bấm
- Nút tải chuỗi kết quả về dưới dạng tệp văn bản khi chuỗi quá dài để sao chép thủ công
- Nút xóa để dọn sạch kết quả trước khi chuyển tệp tiếp theo
- Đọc tệp bằng trình đọc tệp có sẵn của trình duyệt, tệp không được tải lên bất kỳ máy chủ nào
Vì sao đôi khi phải nhét cả tệp vào trong một chuỗi ký tự
Nhiều hệ thống chỉ chấp nhận dữ liệu dạng chữ. Một trường trong JSON không chứa được byte nhị phân, một biến môi trường không xuống dòng được, một ô trong bảng cấu hình chỉ nhận chuỗi, một số API cũ nhận tệp đính kèm dưới dạng chuỗi ký tự thay vì dữ liệu nhiều phần. Base64 sinh ra chính để giải bài toán đó: nó biểu diễn dữ liệu nhị phân bằng 64 ký tự an toàn, đi qua đâu cũng không bị hiểu nhầm hay bị cắt xén. Với người làm web, công dụng thường gặp nhất là nhúng thẳng một biểu tượng nhỏ vào tệp CSS hay vào mã HTML của thư điện tử, để trình duyệt không phải tải thêm một tệp riêng. Điểm cần nhớ là Base64 không nén và không mã hóa, nó chỉ đổi cách biểu diễn, nên dùng sai chỗ thì lợi bất cập hại.
Lợi ích khi sử dụng
- Nhúng được biểu tượng nhỏ vào CSS hay thư điện tử mà không cần đường dẫn tệp riêng
- Đưa được tệp vào những trường chỉ nhận chữ như JSON hay biến môi trường
- Biết ngay chuỗi dài bao nhiêu ký tự để cân nhắc trước khi nhúng
- Tải kết quả về dạng tệp văn bản khi chuỗi dài tới hàng trăm nghìn ký tự
- Tệp không rời khỏi máy nên dùng được với tài liệu nội bộ và chứng từ
Cách chuyển tệp sang Base64
- 1Bấm vào khung nét đứt để chọn tệp từ máy, hoặc kéo tệp thả trực tiếp vào khung đó.
- 2Đối chiếu tên tệp và kiểu MIME hiện ngay bên dưới, vì kiểu MIME này sẽ nằm trong chuỗi kết quả và quyết định trình duyệt hiểu dữ liệu là gì.
- 3Xem ô kết quả để nắm độ dài chuỗi và kích thước ước tính trước khi quyết định có nên nhúng hay không.
- 4Bấm sao chép nếu chuỗi ngắn và bạn dán thẳng vào code, hoặc bấm tải xuống nếu chuỗi quá dài.
- 5Nếu nơi nhận chỉ cần phần dữ liệu thuần, hãy cắt bỏ đoạn đứng trước dấu phẩy đầu tiên trong chuỗi rồi mới dùng.
Kết quả là data URI đầy đủ chứ không phải chuỗi Base64 trần
Đây là điều cần biết đầu tiên để không bị lỗi khi dùng. Chuỗi trả về có dạng gồm từ khóa data, dấu hai chấm, kiểu MIME, dấu chấm phẩy, từ khóa base64, dấu phẩy, rồi mới tới phần dữ liệu đã mã hóa. Với một ảnh PNG, phần đầu sẽ là data hai chấm image gạch chéo png chấm phẩy base64 phẩy. Nhờ có phần đầu này, bạn dán thẳng chuỗi vào thuộc tính src của thẻ ảnh hoặc vào hàm url trong CSS là hiển thị được ngay, không cần thêm gì. Nhưng nếu nơi nhận yêu cầu Base64 thuần, chẳng hạn một trường trong yêu cầu API hay một cột trong cơ sở dữ liệu, thì phần đầu đó sẽ làm hỏng dữ liệu khi giải mã ngược. Cách xử lý là cắt bỏ mọi thứ đứng trước dấu phẩy đầu tiên, kể cả dấu phẩy. Ngược lại, nếu bạn nhận được một chuỗi Base64 thuần từ nơi khác và muốn hiển thị nó thành ảnh, bạn phải tự thêm phần đầu tương ứng với đúng kiểu tệp, thêm sai kiểu thì trình duyệt sẽ từ chối hiển thị.
Vì sao chuỗi Base64 dài hơn tệp gốc đúng một phần ba
Base64 gom dữ liệu theo từng nhóm ba byte, tức hai mươi bốn bit, rồi chia lại thành bốn nhóm sáu bit. Mỗi nhóm sáu bit có sáu mươi bốn giá trị khả dĩ, và mỗi giá trị được ánh xạ sang một ký tự trong bảng gồm hai mươi sáu chữ hoa, hai mươi sáu chữ thường, mười chữ số cùng dấu cộng và dấu gạch chéo. Vậy cứ ba byte gốc thành bốn ký tự, tỷ lệ phình đúng bằng một phần ba, tức khoảng ba mươi ba phẩy ba phần trăm. Khi số byte không chia hết cho ba, phần thiếu được bù bằng một hoặc hai dấu bằng ở cuối chuỗi. Công thức chính xác cho số ký tự là lấy số byte chia ba rồi làm tròn lên, nhân với bốn. Một ảnh 90 kilobyte sẽ thành chuỗi khoảng 120 kilobyte, cộng thêm vài chục ký tự của phần đầu data URI. Con số kích thước ước tính mà công cụ hiển thị được tính ngược từ độ dài chuỗi nhân với ba phần tư, nên nó nhỉnh hơn dung lượng tệp thật một chút vì đã tính cả phần đầu vào.
Khi nào nên nhúng bằng Base64 và khi nào tuyệt đối không nên
Nên nhúng khi tệp rất nhỏ và luôn cần có mặt ngay: một biểu tượng dạng SVG vài trăm byte, một hoa văn lặp nhỏ, một ảnh nền của nút bấm. Ngưỡng thực dụng mà nhiều nhóm phát triển áp dụng là dưới hai tới bốn kilobyte, vì dưới ngưỡng đó chi phí thiết lập một kết nối tải tệp riêng còn lớn hơn phần dữ liệu phình thêm. Không nên nhúng khi tệp lớn, vì ba lý do cụ thể. Thứ nhất, tệp nhúng không được lưu đệm riêng: mỗi lần bạn sửa một dòng CSS thì trình duyệt phải tải lại toàn bộ ảnh nằm trong đó, trong khi để tệp rời thì ảnh vẫn nằm yên trong bộ nhớ đệm. Thứ hai, chuỗi Base64 làm HTML hoặc CSS phình ra, mà đây là những tệp chặn hiển thị, nên trang hiện nội dung chậm hơn. Thứ ba, ảnh nhúng không dùng được cơ chế tải trễ và không dùng được ảnh đáp ứng theo kích thước màn hình. Với thư điện tử thì tình hình còn ngặt hơn: nhiều dịch vụ đọc thư trên nền web chặn ảnh dạng data URI, nên cách an toàn vẫn là đính kèm ảnh theo chuẩn thư hoặc trỏ tới đường dẫn công khai.
Base64 không phải mã hóa, đừng dùng để che dữ liệu
Đây là hiểu nhầm phổ biến và gây hậu quả thật. Base64 là phép đổi cách biểu diễn, hoàn toàn thuận nghịch và không cần khóa. Bất kỳ ai có chuỗi đều giải ngược ra nội dung gốc trong vài giây bằng một hàm có sẵn trong mọi ngôn ngữ lập trình, thậm chí bằng một dòng lệnh trên máy. Vì vậy đừng bao giờ coi việc mã hóa Base64 là cách bảo vệ mật khẩu, khóa API, số tài khoản hay tài liệu nội bộ. Chỗ dễ nhầm nhất là các thẻ định danh dạng JWT: phần thân của thẻ chỉ được mã hóa Base64 biến thể an toàn cho địa chỉ web, nên ai cầm thẻ cũng đọc được toàn bộ nội dung bên trong, phần chữ ký chỉ chống sửa đổi chứ không giấu nội dung. Tương tự, kiểu xác thực cơ bản trong giao thức web gửi tên đăng nhập và mật khẩu dưới dạng Base64, nghĩa là gần như gửi trần nếu kết nối không được mã hóa. Muốn giấu nội dung thật thì phải dùng thuật toán mã hóa có khóa, còn Base64 chỉ để dữ liệu đi qua đường truyền chỉ chấp nhận chữ.
Các biến thể Base64 và lỗi hay gặp khi dán chuỗi đi nơi khác
Bảng ký tự chuẩn dùng dấu cộng và dấu gạch chéo, nhưng hai ký tự này lại có ý nghĩa riêng trong địa chỉ web và trong tên tệp. Vì thế có một biến thể an toàn cho địa chỉ web thay dấu cộng bằng dấu trừ, thay dấu gạch chéo bằng dấu gạch dưới và thường bỏ luôn dấu bằng ở cuối. Đây chính là biến thể dùng trong thẻ JWT. Nếu bạn lấy chuỗi từ công cụ này rồi nhét thẳng vào tham số của một địa chỉ web mà không chuyển đổi, dấu cộng rất dễ bị hiểu thành dấu cách ở phía nhận và dữ liệu giải mã ra sẽ hỏng. Một khác biệt nữa nằm ở thư điện tử: chuẩn định dạng nội dung thư quy định chuỗi Base64 phải ngắt dòng sau mỗi bảy mươi sáu ký tự, trong khi chuỗi ở đây là một dòng liền mạch. Khi dán vào nơi tự động ngắt dòng hoặc cắt bớt, chuỗi sẽ hỏng. Cuối cùng, độ dài chuỗi Base64 hợp lệ luôn là bội số của bốn, nên nếu giải mã báo lỗi thì việc đầu tiên nên kiểm tra là chuỗi có bị mất ký tự ở cuối trong lúc sao chép hay không.
Câu hỏi thường gặp (FAQ)
Vì sao đầu chuỗi kết quả có đoạn data và tên kiểu tệp?
Vì công cụ trả về data URI hoàn chỉnh chứ không phải Base64 thuần. Phần đầu gồm kiểu MIME và từ khóa base64 giúp trình duyệt biết dữ liệu phía sau là gì, nhờ đó bạn dán thẳng vào thuộc tính src của thẻ ảnh hay hàm url trong CSS là hiển thị được ngay.
Làm sao lấy chuỗi Base64 thuần không có phần đầu?
Xóa toàn bộ phần đứng trước dấu phẩy đầu tiên, kể cả dấu phẩy đó. Phần còn lại chính là Base64 thuần. Đây là dạng mà hầu hết API và cột cơ sở dữ liệu yêu cầu, giữ nguyên phần đầu sẽ khiến bên nhận giải mã ra dữ liệu hỏng.
Tệp của tôi có bị tải lên máy chủ không?
Không. Công cụ dùng trình đọc tệp có sẵn trong trình duyệt để đọc tệp từ ổ đĩa và mã hóa ngay trên máy bạn, không có bước gửi tệp đi. Đóng tab là kết quả biến mất, nên bạn dùng được với hợp đồng, chứng từ hay ảnh chưa công bố.
Vì sao chuỗi kết quả nặng hơn tệp gốc?
Vì Base64 đổi mỗi ba byte thành bốn ký tự, nên dữ liệu phình thêm đúng một phần ba, tức khoảng ba mươi ba phần trăm. Một tệp 300 kilobyte sẽ cho chuỗi khoảng 400 kilobyte. Base64 chỉ đổi cách biểu diễn chứ không nén, muốn giảm dung lượng thì phải nén tệp trước khi mã hóa.
Có giới hạn dung lượng tệp không?
Không có giới hạn cứng, nhưng cả tệp lẫn chuỗi kết quả đều nằm trong bộ nhớ của tab trình duyệt, nên tệp vài megabyte trở lên sẽ khiến trang chậm và ô kết quả rất nặng khi cuộn. Với tệp lớn, cách thực tế hơn là dùng lệnh mã hóa Base64 có sẵn trên máy.
Vì sao tệp tải về có tên kết thúc bằng hai phần mở rộng?
Vì công cụ giữ nguyên tên tệp gốc rồi thêm đuôi văn bản vào sau, nên một ảnh tên anh.png sẽ tải về thành anh.png.txt. Đây là tệp văn bản chứa chuỗi Base64 chứ không phải ảnh, bạn mở bằng trình soạn thảo văn bản là đọc được nội dung.
Chuyển ngược từ Base64 về tệp thì làm thế nào?
Nếu là data URI, chỉ cần dán cả chuỗi vào thanh địa chỉ của trình duyệt là tệp mở ra hoặc được tải về. Nếu là Base64 thuần, bạn cần biết đúng kiểu tệp để thêm phần đầu tương ứng, hoặc dùng công cụ giải mã Base64 rồi lưu kết quả với đúng phần mở rộng.
Mã hóa Base64 có bảo mật cho tệp không?
Không hề. Base64 hoàn toàn thuận nghịch và không cần khóa, ai có chuỗi cũng giải ngược ra nội dung gốc trong vài giây. Đừng dùng nó để giấu mật khẩu, khóa API hay tài liệu nhạy cảm. Muốn bảo vệ thật thì phải dùng thuật toán mã hóa có khóa.
Vì sao kiểu tệp hiện là không xác định?
Vì trình duyệt đoán kiểu MIME chủ yếu dựa vào phần mở rộng của tên tệp, nên với định dạng lạ hoặc tệp không có phần mở rộng thì nó bỏ trống. Lúc đó phần đầu của data URI sẽ thiếu kiểu tệp, và bạn nên tự thêm kiểu đúng vào trước khi dùng.
Nhúng ảnh bằng Base64 vào CSS có làm web chậm không?
Có, nếu ảnh lớn. Ảnh nhúng không được lưu đệm riêng nên sửa một dòng CSS là trình duyệt phải tải lại cả ảnh, đồng thời tệp CSS phình ra mà đây lại là tệp chặn hiển thị. Chỉ nên nhúng những tệp rất nhỏ, thực tế là dưới khoảng hai tới bốn kilobyte.
Chuyển được nhiều tệp cùng lúc không?
Không, mỗi lần chỉ chuyển được một tệp và tệp sau sẽ thay chỗ tệp trước trong ô kết quả. Nếu cần xử lý hàng loạt, hãy dùng lệnh mã hóa Base64 trên dòng lệnh kết hợp vòng lặp, hoặc viết một đoạn kịch bản ngắn đọc cả thư mục.
Dán chuỗi vào địa chỉ web thì bị hỏng, vì sao?
Vì bảng ký tự chuẩn có dấu cộng và dấu gạch chéo, hai ký tự này mang ý nghĩa riêng trong địa chỉ web và dấu cộng thường bị hiểu thành dấu cách. Với địa chỉ web, hãy chuyển sang biến thể an toàn bằng cách thay dấu cộng bằng dấu trừ và dấu gạch chéo bằng dấu gạch dưới.
Từ khóa liên quan
- chuyển file sang base64
- file to base64 online
- công cụ mã hóa base64 miễn phí
- base64 encode file
- chuyển ảnh sang base64
- data uri là gì
- nhúng ảnh base64 vào css
- base64 pdf online
- chuỗi base64 thuần
- base64 tăng dung lượng bao nhiêu
- bảng ký tự base64
- base64url khác base64
- giải mã base64 về file
- base64 có phải mã hóa không
- nhúng svg base64
- chuyển font sang base64
- base64 trong json
- encode file to string online
- kiểu mime của file
- công cụ base64 chạy trên trình duyệt
