Câu hỏi Làm cách nào để xử lý một tệp tải lên bằng Meteor?


Điều gì sẽ là cách kinh điển để xử lý một tập tin tải lên với Meteor?


76
2018-04-11 02:54


gốc


Đó là một câu hỏi mơ hồ ... Bạn có hỏi cách xử lý nó ở phía máy khách hay máy chủ không? Dù bằng cách nào, tôi tưởng tượng (tôi đã không bao giờ sử dụng sao băng) rằng cách để xử lý một tập tin tải lên là khá nhiều giống như với bất kỳ máy chủ. Phía máy khách: gửi yêu cầu POST tới URL có tệp như một phần của phần thân yêu cầu. Phía máy chủ: lắng nghe các yêu cầu POST tại URL đó và khi có yêu cầu, hãy đọc phần thân yêu cầu và thực hiện bất kỳ thứ gì bạn muốn với bất kỳ tệp nào chứa nó. Đó là cơ bản như thế nào tôi đã thực hiện nó với nút / mùa xuân ... Nếu bạn có thể cụ thể hơn về những gì bạn cần giúp đỡ, có lẽ tôi có thể hữu ích hơn ... - JKing
Xin chào JKing, bạn nên kiểm tra Meteor, đó là lý do tại sao nó là một câu hỏi thú vị: meteor.com - David


Các câu trả lời:


Hiện tại không có vẻ là một cách để tương tác với máy chủ HTTP hoặc làm bất cứ điều gì liên quan đến HTTP.

Điều duy nhất bạn có thể làm là nói chuyện với máy chủ qua các phương thức RPC được Meteor.methods trưng ra hoặc nói chuyện trực tiếp với mongoDB trên API mongoDB.


17
2018-04-11 06:24



Cảm ơn Raynos. Có lẽ sẽ thử cách của Luan và bỏ qua việc tải lên với các trình tải lên JS lên S3 hoặc một thứ gì đó sắp xếp. - David
@Raynos Bạn có biết liệu API Mongo tiếp xúc có hỗ trợ GridFS không? Tôi không thể thấy đề cập đến nó. - Steve Jalim
@stevejalim Tôi không biết, hãy đọc mã nguồn cho tập con của API mongo nó hỗ trợ - Raynos
@stevejalim Tôi nhìn vào nguồn không có bất kỳ hỗ trợ GridFS trong minimongo (gói họ sử dụng) - bobbywilson0
Tôi đến muộn một chút ở bữa tiệc ở đây, nhưng bạn cũng có thể xem vài tập cuối cùng của eventedmind.com nơi tôi đang xây dựng một trình tải lên tệp cho thiên thạch. Phiên bản tải lên trực tiếp của gói sẽ được phát hành trong tuần này. Nó được gọi là tập tin sao băng. - cmather


Tôi đã sử dụng http://filepicker.io. Họ sẽ tải lên tập tin, lưu trữ nó vào S3 của bạn, và trả lại cho bạn một URL nơi tập tin được. Sau đó, tôi chỉ cần gõ url vào một DB.

  1. Wget tập lệnh filepicker vào thư mục khách hàng của bạn.

    wget https://api.filepicker.io/v0/filepicker.js
    
  2. Chèn thẻ đầu vào filepicker

    <input type="filepicker" id="attachment">
    
  3. Khi khởi động, khởi tạo nó:

    Meteor.startup( function() {
        filepicker.setKey("YOUR FILEPICKER API KEY");
        filepicker.constructWidget(document.getElementById('attachment'));
    });
    
  4. Đính kèm trình xử lý sự kiện

    Templates.template.events({
        'change #attachment': function(evt){
            console.log(evt.files);
        }
    });
    

44
2017-09-18 20:47



Yay, filepicker.io! Hoàn toàn làm việc như một sự quyến rũ với Heroku. - AbigailW
Nó chỉ miễn phí trong 10 ngày dùng thử :( - aladine
Pfff .. Tôi sẽ không trả 100 đô la chỉ để tải tệp lên S3. - Rijk
Echo @rijk, không biết tại sao dịch vụ trả tiền là # 1 đã bỏ phiếu cho câu trả lời .. github.com/VeliovGroup/Meteor-Files hoặc là themeteorchef.com/recipes/uploading-files-to-amazon-s3 là cả hai giải pháp miễn phí triển khai libs nguồn mở. - GFargo
tôi sử dụng edgee:slingshot, nó tuyệt vời cho các tệp lớn (tải trực tiếp lên S3, không phải qua máy chủ ứng dụng của bạn). - Rijk


Đối với hình ảnh, tôi sử dụng phương pháp tương tự Dario's ngoại trừ tôi không ghi tập tin vào đĩa. Tôi lưu trữ dữ liệu trực tiếp trong cơ sở dữ liệu dưới dạng một trường trên mô hình. Điều này phù hợp với tôi vì tôi chỉ cần hỗ trợ các trình duyệt hỗ trợ API tệp HTML5. Và tôi chỉ cần hỗ trợ hình ảnh đơn giản.

Template.myForm.events({
  'submit form': function(e, template) {
    e.preventDefault();
    var file = template.find('input type=["file"]').files[0];
    var reader = new FileReader();
    reader.onload = function(e) {
      // Add it to your model
      model.update(id, { $set: { src: e.target.result }});

      // Update an image on the page with the data
      $(template.find('img')).attr('src', e.target.result);
    }
    reader.readAsDataURL(file);
  }
});

26
2018-01-04 20:53





Tôi vừa mới nghĩ ra triển khai tệp tải lên sử dụng Meteor.methods và API của tệp HTML5. Cho tôi biết bạn nghĩ gì.


19
2017-10-20 05:32



Vì vậy, những hướng dẫn đó làm việc rất tốt. Các giải pháp đã được 10x dễ dàng hơn tôi mong đợi, và mã khá nhiều làm việc hoàn hảo. Điều đó đang được nói, giải pháp tải hình ảnh trực tiếp lên hệ thống tệp cục bộ node.js. Ban đầu nó hoạt động tốt trên các máy dev địa phương, nhưng có vấn đề với các nhà cung cấp dịch vụ nền tảng (PaaS), bao gồm Heroku và Nodjitsu. Vấn đề là có các vấn đề về quyền hệ thống tập tin với giải pháp này. Vì vậy, giải pháp này yêu cầu hoặc lưu trữ máy chủ của riêng bạn, hoặc có một cơ sở hạ tầng mạnh mẽ hơn, chẳng hạn như Amazon Elasticbeanstalk. - AbigailW


Có một gói mới: edgee: súng cao su. Nó không tải các tập tin lên máy chủ sao băng của bạn, nhưng tốt hơn là nó cho phép máy chủ sao băng tập trung vào mục tiêu chính của nó là phục vụ ứng dụng sao băng thay vì xử lý các chuyển tập tin tốn kém.

Thay vào đó, nó tải tệp lên dịch vụ lưu trữ đám mây. Hiện tại nó hỗ trợ AWS S3 và Google Cloud Files, nhưng nó cũng sẽ hỗ trợ Rackspace Cloud Files và có lẽ Cloudinary trong tương lai.

Máy chủ sao băng của bạn chỉ hoạt động như một điều phối viên.

Direct VS Indirect uploads

Nó cũng là một gói rất nhẹ và linh hoạt.


11
2018-01-12 23:35





có một gói không khí gọi là bộ định tuyến cho phép điều đó.

thực sự, cách tốt nhất để xử lý tải lên tệp hiện là bộ sưu tậpFS


7
2018-03-24 15:57



Nhóm add-in CFS không thích hợp cho sản xuất - vì chúng triển khai ứng dụng Meteor của chúng tôi không thành công liên tục, đặc biệt là sau khi nâng cấp ứng dụng lên Meteor 1.0. Tôi khuyên bạn không nên sử dụng các gói CFS. - Shahriyar Imanov


Đây là giải pháp tốt nhất cho lần này. Nó sử dụng bộ sưu tậpFS.

meteor add cfs:standard-packages
meteor add cfs:filesystem

Khách hàng:

Template.yourTemplate.events({
    'change .your-upload-class': function(event, template) {
        FS.Utility.eachFile(event, function(file) {
            var yourFile = new FS.File(file);
            yourFile.creatorId = Meteor.userId(); // add custom data
            YourFileCollection.insert(yourFile, function (err, fileObj) {
                if (!err) {
                   // do callback stuff
                }
            });
        });
    }
});

Máy chủ:

YourFileCollection = new FS.Collection("yourFileCollection", {
    stores: [new FS.Store.FileSystem("yourFileCollection", {path: "~/meteor_uploads"})]
});
YourFileCollection.allow({
    insert: function (userId, doc) {
        return !!userId;
    },
    update: function (userId, doc) {
        return doc.creatorId == userId
    },
    download: function (userId, doc) {
        return doc.creatorId == userId
    }
});

Bản mẫu:

<template name="yourTemplate">
    <input class="your-upload-class" type="file">
</template>

7
2017-09-09 06:12



Tôi sử dụng tất cả các mã của bạn. Meteor bắt đầu bình thường nhưng sau khi tôi nhấp vào một mục, nó không tải nó lên máy chủ? Không có gì vui vẻ. - Erdem Güngör
@ ErdemGüngör Kiểm tra yourTemplate và lớp tải lên của bạn trong html giống như Mẫu. yourTemplate .events và 'thay đổi .your-upload-class'. Thêm console.log vào hàm xử lý sự kiện. - Raz
@Raz Bạn có khuyên bạn nên sử dụng chúng? Chi nhánh devel của họ (có vẻ là mặc định trên Github) nói - "Chi nhánh này đang được phát triển tích cực ngay bây giờ (2015-01-26). Có lỗi và API có thể tiếp tục thay đổi. Vui lòng giúp kiểm tra và sửa lỗi nhưng chưa sử dụng trong sản xuất. " Và nhánh Master của họ có vẻ khá cũ. Tôi đang nghĩ đến việc mạo hiểm. Bạn có đề nghị gì? - Ayrton Senna
@AyrtonSenna Chúng tôi sử dụng nó trong sản xuất trên các dự án nhỏ và nó hoạt động tốt. Nhưng bạn nên làm bài kiểm tra hồi quy tốt đẹp sau mỗi bài kiểm tra meteor update. Không chỉ vì gói này. - Raz
Nghe hay đấy. Sẽ thử nó. Cảm ơn vì đầu vào của bạn. - Ayrton Senna


Bạn có thể thử tải trực tiếp lên amazon S3, thực hiện một số thủ thuật với người tải lên và nội dung js. http://aws.amazon.com/articles/1434


3
2018-04-11 12:57



Có gói xử lý tải lên S3 cho Meteorhiện nay. - Dan Dascalescu