2015-10-22 2 views
9

Я использую Resumable.js с моим приложением Node.js-express. Я могу добраться до точки, где я знаю, передача файлов была успешной, потому что я могу console.log (req.body) и увидеть это ниже ...Resumable.js не может сохранить файл на стороне сервера

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

документации весьма смутное представление о том, что делать после этого точка. Мне нужно сохранить этот файл в каталоге на моем сервере. Любая помощь о том, как это сделать, будет очень признательна. Благодаря!

+0

Любые примеры github были бы удивительными .. – Nodedeveloper101

+0

Хорошо, сам файл находится в 'req.files.file' ... Итак, у меня есть переменная javascript, которая является файлом .. var file = req.files.file; .... как сохранить эту переменную в виде файла в определенном каталоге на моем сервере? – Nodedeveloper101

+0

Я понял, как писать .txt-файлы на сервер, используя 'fs'. Поэтому я могу писать файлы на сервер. И я могу console.log() данные о файле. Но не могу понять, какой объект мне нужно передать в fs.writeFile (имя файла, файл, обратный вызов), который на самом деле является файлом ... прямо сейчас он просто сохраняет [объект объекта] – Nodedeveloper101

ответ

1

Я не использую Resumable.js, но что-то подобное, и вот как я это делаю на сервере Nodejs/express. Вы также можете посмотреть на код сервера здесь: https://github.com/MichaelLeeHobbs/roboMiner/tree/master/server/api/world, однако имейте в виду, что он не является полным и экспериментальным. Приведенный ниже код является лишь простым примером.

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

Не эксперт, но я попробовал и получил пример, работающий на вас. Вы не предоставили достаточно информации в своем вопросе, поэтому я собираюсь начать с нуля.

Я следил за официальнымрепо и предоставленными образцами, и мне пришлось внести некоторые изменения, чтобы получить куски файлов, сохраненные в определенном каталоге, а затем больше настроек, чтобы сшить эти куски обратно вместе и больше настроить, чтобы удалить ненужные куски впоследствии. Очевидно, что все эти хитрости - это подсказки, представленные в коде, и в других местах, которые я просматривал. Примерно flow.js также использует аналогичный механизм (не совсем уверен).

Мне в основном нужно было изменить app.js в одном из образцов, чтобы иметь возможность загружать файлы из браузера, а затем сохранять их локально.

  1. Pass местоположения папка возобновляемое, где файл глыба должна быть добавлена ​​
  2. Обеспечить необходимые условия и команды, так что, когда глыбы будут загружены, вы создаете поток записи, а затем использовать возобновляемые сшить куски вместе и сохранить их как оригинальный файл.
  3. Наконец удалить все куски

Инструкции использовать gist получить работу экспресс-приложение (вы можете оформить официальный образец GitHub и внести изменения или вы можете следовать ниже инструкции):

  1. Создать каталог
  2. Создание app.js, resumable.js и возобновляемую-Node.js с сутью в каталоге
  3. копировать/вставить package.json и сделать НПМ установки, чтобы получить модули (или вручную npm install эти express, path, fs, connect-multiparty)
  4. создать uploads каталог в главном каталоге приложения и убедитесь, что он доступен для записи
  5. Copy/мимо public директории из here, который содержит icons в виде .png и style.css и index.html для загрузки
  6. Изменить значение target в строке 49 или 50 с индексом.html в общедоступном каталоге, который вы только что скопировали на адрес вашего сервера в моем случае http://localhost:3000/upload
  7. Вы можете настроить размер куска, количество одновременных загрузок пакетов и т. д. в index.html, но я оставил их по умолчанию (на самом деле, я сменил куски от 3 до 4)
  8. Выполнено все, что вышло выше, тогда вы хорошо пойдете.
  9. Запустите приложение т.е. nodemon app.js или узел app.js
  10. Перейдите на ваш адрес сервера или http://localhost:3000/upload, и вы увидите index.html вынесенное, как показано ниже:

enter image description here

бревно консоли ниже (обратите внимание на конец. - куски удалены)

enter image description here

Наконец, у меня есть image2.jpg в каталоге uploads.

TL; DR

Вам необходимы следующие твики в app.js и файл index.html, чтобы иметь возможность загружать и сохранять загруженный файл с помощью Resumable.js.

index.html щипнули изменить целевое значение, чтобы указать его URL-адрес сервера в моем случае 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 щипнули отправить resumable директорию, где сохраните файл (вверху всего).

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

Я также переделаны app.js изменить содержание app.post('/uploads',...) см 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': '*' 
    }); 
    }); 
}); 

И, наконец, последний подстройка к app.js находится на последнем обработчика маршрута, следующий файл

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

Я переместил файл resumable.js в том же каталоге, что и другие, так Мне нужно было настроить изменение его местоположения, чтобы createReadStream нашел его.

Смежные вопросы