2015-10-22 15 views
9

Tôi đang sử dụng Resumable.js bằng ứng dụng Node.js-express của mình. Tôi có thể lấy tới điểm mà tôi biết chuyển file đã thành công vì tôi có thể console.log (req.body) và xem dưới đây ...Resumable.js không thể lưu tệp vào thư mục phía máy chủ

{ resumableChunkNumber: '77', 
    resumableChunkSize: '1048576', 
    resumableCurrentChunkSize: '1064195', 
    resumableTotalSize: '80755971', 
    resumableType: '', 
    resumableIdentifier: '80755971-humanfastq', 
    resumableFilename: 'human.fastq', 
    resumableRelativePath: 'human.fastq', 
    resumableTotalChunks: '77' } 

Các tài liệu là khá mơ hồ về những việc cần làm sau này điểm. Tôi cần lưu tệp này vào thư mục trên máy chủ của mình. Bất kỳ trợ giúp về cách thực hiện điều này sẽ được đánh giá cao. Cảm ơn!

+0

Bất kỳ ví dụ github nào cũng sẽ tuyệt vời .. – Nodedeveloper101

+0

Ok, chính tệp đó nằm trong 'req.files.file' ... Vì vậy, tôi có biến javascript thats một tệp .. var file = req.files.file; .... làm cách nào để lưu biến này dưới dạng tệp vào một thư mục cụ thể trên máy chủ của tôi? – Nodedeveloper101

+0

Tôi đã tìm ra cách viết các tệp .txt vào máy chủ bằng 'fs'. Vì vậy, tôi có thể ghi các tập tin vào máy chủ. Và tôi có thể console.log() dữ liệu về tập tin. Nhưng không thể tìm ra đối tượng nào tôi phải chuyển vào fs.writeFile (tên tệp, tệp, gọi lại) thực sự là tệp ... ngay bây giờ nó chỉ lưu [đối tượng đối tượng] – Nodedeveloper101

Trả lời

1

Tôi không sử dụng Resumable.js nhưng có điều gì đó tương tự và dưới đây là cách tôi làm điều đó trong máy chủ Nodejs/express. Bạn cũng có thể xem xét nhiều mã máy chủ tại đây: https://github.com/MichaelLeeHobbs/roboMiner/tree/master/server/api/world tuy nhiên hãy nhớ rằng nó không hoàn chỉnh và là thử nghiệm. Mã dưới đây chỉ là một ví dụ trần.

import move from '../../libraries/fsMove.js'; 

    export function create(req, res) { 
     var file = req.files.file; 
     console.log(file.name); 
     console.log(file.type); 
     console.log(file.path); 
     console.log(__dirname); 
     move(file.path, __dirname + '/../../uploads/worlds/' + file.originalFilename, function(err){ 
     if (err) { 
      console.log(err); 
      handleError(res)(err); 
      return; 
     } 
     World.createAsync(req.body) 
      .then(responseWithResult(res, 201)) 
      .catch(handleError(res)); 
     }); 
    } 

    // fsMove.js 
    // http://stackoverflow.com/questions/8579055/how-i-move-files-on-node-js/29105404#29105404 
    var fs = require('fs'); 

    module.exports = function move (oldPath, newPath, callback) { 
     fs.rename(oldPath, newPath, function (err) { 
     if (err) { 
      if (err.code === 'EXDEV') { 
      copy(); 
      } else { 
      callback(err); 
      } 
      return; 
     } 
     callback(); 
     }); 

     function copy() { 
     var readStream = fs.createReadStream(oldPath); 
     var writeStream = fs.createWriteStream(newPath); 

     readStream.on('error', callback); 
     writeStream.on('error', callback); 
     readStream.on('close', function() { 

      fs.unlink(oldPath, callback); 
     }); 

     readStream.pipe(writeStream); 

     } 
    }; 
4

Không phải chuyên gia nhưng tôi đã thử và có ví dụ phù hợp với bạn. Bạn đã không cung cấp đủ thông tin trong câu hỏi của bạn, vì vậy tôi sẽ bắt đầu từ đầu.

Tôi đã theo dõi github repo chính thức và các mẫu được cung cấp và tôi phải thực hiện một số chỉnh sửa để lưu các tập tin được lưu trong một thư mục cụ thể, sau đó tinh chỉnh thêm các đoạn đó lại với nhau và tinh chỉnh nhiều hơn để xóa các phần không cần thiết sau đó. Rõ ràng tất cả những điều chỉnh này đều là những gợi ý được cung cấp trong mã, và những nơi khác mà tôi đã duyệt. Xuất hiện flow.js cũng đang sử dụng một cơ chế tương tự (không hoàn toàn chắc chắn).

Tôi về cơ bản cần thay đổi app.js trong một trong các mẫu để có thể tải lên tệp từ trình duyệt và sau đó lưu chúng cục bộ.

  1. đèo vị trí thư mục để resumable nơi các khối tập tin nên được bổ sung
  2. Cung cấp điều kiện và các lệnh cần thiết để khi khối được tải lên, bạn tạo một dòng ghi và sau đó sử dụng resumable để khâu các khối với nhau và lưu chúng dưới dạng tệp gốc.
  3. Cuối cùng xóa tất cả các khối

Hướng dẫn sử dụng gist để có được sự đồng ý ứng dụng làm việc (bạn có thể kiểm tra các mẫu github chính thức và thực hiện thay đổi hoặc bạn có thể làm theo hướng dẫn dưới đây):

  1. Tạo thư mục
  2. Tạo app.js, resumable.js và resumable-node.js từ gist trong thư mục
  3. sao chép/dán package.json và cài đặt npm để nhận các module (hoặc bằng tay npm install những express, path, fs, connect-multiparty)
  4. tạo uploads thư mục trong thư mục ứng dụng chính và chắc chắn rằng nó là có thể ghi
  5. Copy/quá khứ public thư mục từ here chứa icons theo hình thức các tệp .png và style.cssindex.html để tải lên
  6. Thay đổi giá trị target trong dòng 49 hoặc 50 của chỉ mục.html trong thư mục công cộng bạn chỉ cần sao chép vào địa chỉ máy chủ của bạn trong trường hợp của tôi http://localhost:3000/upload
  7. Bạn có thể chỉnh kích cỡ đoạn, số lượng tải lên đồng thời, vv trong index.html nhưng, tôi để chúng ở chế độ mặc định (trên thực tế, tôi đã thay đổi các đoạn từ 3 đến 4)
  8. Xong tất cả những điều trên, khi đó bạn tốt.
  9. Chạy ứng dụng tức là nodemon app.js hoặc nút app.js
  10. Navigate to địa chỉ máy chủ của bạn hoặc http://localhost:3000/upload và bạn sẽ thấy những index.html render như hình dưới đây:

enter image description here

bên dưới giao diện điều khiển log (chú ý cuối cùng -. khối loại bỏ)

enter image description here

Một cuối cùng tôi có image2.jpg trong thư mục tải lên.

TL; DR

Bạn cần chỉnh sau vào app.js và file index.html để có thể tải lên và lưu tập tin được tải lên thông qua Resumable.js.

index.html đã được tinh chỉnh để thay đổi giá trị mục tiêu để trỏ nó đến url máy chủ trong trường hợp của tôi http://localhost:3000/upload

var r = new Resumable({ 
    target:'http://localhost:3000/upload', 
    chunkSize:1*1024*1024, 
    simultaneousUploads:4, 
    testChunks:false, 
    throttleProgressCallbacks:1 
}); 

app.js đã được tinh chỉnh để gửi resumable một thư mục nơi để lưu tập tin (trên cùng nhất).

var resumable = require('./resumable-node.js')(__dirname + "/uploads"); 

Tôi cũng chỉnh app.js thay đổi nội dung của app.post('/uploads',...) thấy gist.

// Handle uploads through Resumable.js 
app.post('/upload', function(req, res){ 
    resumable.post(req, function(status, filename, original_filename, identifier){ 
    if (status === 'done') { 
     var stream = fs.createWriteStream('./uploads/' + filename); 

     //stich the chunks 
     resumable.write(identifier, stream); 
     stream.on('data', function(data){}); 
     stream.on('end', function(){}); 

     //delete chunks 
     resumable.clean(identifier); 
    } 
    res.send(status, { 
     // NOTE: Uncomment this funciton to enable cross-domain request. 
     //'Access-Control-Allow-Origin': '*' 
    }); 
    }); 
}); 

Và tinh chỉnh cuối cùng cuối cùng để các app.js là xử lý tuyến đường cuối cùng, các tập tin sau đây

s.createReadStream("./resumable.js").pipe(res); 

Tôi di chuyển các resumable.js tập tin vào thư mục tương tự như những người khác, vì vậy Tôi cần phải tinh chỉnh thay đổi vị trí của nó để createReadStream tìm thấy nó.

Các vấn đề liên quan