JavaScript: Tải lên tệp


187

Hãy nói rằng tôi có yếu tố này trên trang:

<input id="image-file" type="file" />

Điều này sẽ tạo một nút cho phép người dùng trang web chọn một tệp thông qua hộp thoại "Mở tệp ..." của hệ điều hành trong trình duyệt.

Giả sử người dùng nhấp vào nút nói, chọn một tệp trong hộp thoại, sau đó nhấp vào nút "Ok" để đóng hộp thoại.

Tên tệp đã chọn hiện được lưu trữ trong:

document.getElementById("image-file").value

Bây giờ, giả sử rằng máy chủ xử lý các POST nhiều phần tại URL "/ upload / image".

Làm cách nào để gửi tệp tới "/ upload / image"?

Ngoài ra, làm cách nào để tôi nghe thông báo rằng tệp đã được tải lên xong?


2
JavaScript không xử lý các video tải lên, vì nó là máy chủ. Kịch bản phía máy chủ sẽ nhận tệp, và sau đó di chuyển nó. Đối với php từ thư mục tạm thời vào thư mục mong muốn.
Bakudan


14
Được bình chọn để mở lại vì câu hỏi là về POJS (javascript cũ) không phải jQuery.
e2-e4

Câu trả lời:


95

Trừ khi bạn đang cố tải lên tệp bằng ajax, chỉ cần gửi biểu mẫu đến /upload/image.

<form enctype="multipart/form-data" action="/upload/image" method="post">
    <input id="image-file" type="file" />
</form>

Nếu bạn muốn tải lên hình ảnh trong nền (ví dụ: không gửi toàn bộ biểu mẫu), bạn có thể sử dụng ajax:


hoặc kích thước iframe 0x0 với tập lệnh tải lên hình ảnh bên trong src = "" và gửi biểu mẫu cho nó bằng cách sử dụng target = "iframeId" đọc kết quả trên iframe src .load event có thể được ràng buộc bằng jQuery.
Dmitry

11
Ngày nay, thực sự có thể nâng cấp thông qua Javascript và Ajax, xem: stackoverflow.com/a/10811427/694469 (Tôi không downvote).
KajMagnus

35
@KajMagnus, có lẽ bạn có nghĩa là 'tải lên' nhưng vô tình nói 'upvote'
Samuel Allan

82

Tinh khiết

Bạn có thể sử dụng tìm nạp tùy chọn với await-try-Catch

let photo = document.getElementById("image-file").files[0];
let formData = new FormData();

formData.append("photo", photo);
fetch('/upload/image', {method: "POST", body: formData});

Phương pháp trường học cũ - xhr

let photo = document.getElementById("image-file").files[0];  // file from input
let req = new XMLHttpRequest();
let formData = new FormData();

formData.append("photo", photo);                                
req.open("POST", '/upload/image');
req.send(formData);

TÓM LƯỢC

  • Ở phía máy chủ, bạn có thể đọc tên tệp gốc (và thông tin khác) được tự động đưa vào để yêu cầu bởi trình duyệt trong filenametham số formData.
  • Bạn KHÔNG cần phải đặt tiêu đề yêu cầu Content-Typethành multipart/form-data- điều này sẽ được trình duyệt tự động đặt.
  • Thay vì /upload/imagebạn có thể sử dụng địa chỉ đầy đủ như thế nào http://.../upload/image.
  • Nếu bạn muốn gửi nhiều tệp trong một yêu cầu, hãy sử dụng multiplethuộc tính: <input multiple type=... />và đính kèm tất cả các tệp đã chọn vào formData theo cách tương tự (ví dụ photo2=...files[2];... formData.append("photo2", photo2);)
  • Bạn có thể bao gồm dữ liệu bổ sung (json) để yêu cầu, ví dụ như let user = {name:'john', age:34}theo cách này:formData.append("user", JSON.stringify(user));
  • Giải pháp này sẽ hoạt động trên tất cả các trình duyệt chính.

Làm việc hoàn hảo cho tôi.
Triệu Nguyễn

formData === mẫu gửienctype="multipart/form-data"
xgqfrms

Tôi đang gặp lỗinet::ERR_ABORTED 405 (Method Not Allowed)
Hidayt Rahman

@HidaytRahman lỗi này thường xuất hiện khi serwer không thực hiện phương thức POST cho url của bạn
Kamil Kiełczewski

1
Lạ - Theo tiêu đề của bạn, tôi đã nghĩ rằng chúng tôi không còn yêu cầu máy chủ: D
Hidayt Rahman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.