03-05-2020

Magikfiles V1

4 minutoj

Kiel vi eble scias, mi estas la kreinto kaj ellaboranto de MagikFiles, senpaga liberfonta kaj memloĝigita dosierpartumo. La tuta kodo estas sub la licenco MIT por ke ĉiuj povu reuzi ĝin persone aŭ en profesia medio.

Mi komencis ĉi tiun projekton en februaro 2020, kiel maniero lerni kiel uzi NodeJS kaj Express kaj ĝi rapide fariĝis la plej aktiva, pri kiu mi nun laboras. Se mi estus plej honesta, mi dirus, ke mi malamas ĉi tiun projekton, ĉar ĝi estas farita unike per Javaskripto kaj ĝi estas unu el la lingvoj, kiujn mi malplej ŝatas, sed pro ĉi tiu artikolo, ni diru, ke ĉio estas bona kaj ni vidu kiel ĝi funkcias. funkcias.

Unue, en la komenco, mi volis, ke Magikfiles estu kongrua kun ActiveDirectory, por ke ĝi povu esti uzata en kompanio pli facile kiel vi dividas dosieron, ĝi detektas aŭtomate la nunan uzanton, malfermas ŝprucfenestron kun ĉiuj kontaktoj kaj kontrolas tiujn ili volas, ke la dosiero estu dividita kun. Mi rapide forlasis ĉi tiun ideon, ĉar mi estis tro pigra por reprodukti AD-infrastrukturon en mia propra reto kaj mi pensas, ke estus malordo integri ĝuste.

Por administri la alŝutojn, mi uzis express-fileupload, vere simpla biblioteko. Ĉar mi volis subteni plurdosierajn alŝutojn same kiel ununurajn alŝutojn, ĉi tiu malgranda kodo estis mia unua atingo de la projekto:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
let sampleFile = req.files.file;
// If the 'file' property is an array:
// Multiple upload
if (Array.isArray(sampleFile)) {
  sampleFile.forEach((element) => {
    element.mv(`${__dirname}/f/${fileUUID}/${element.name}`, function (err) {
      if (err) {
        return res.status(500).send(err);
      }
    });
  });
} else {
  // If the 'file' property is not an array:
  // Simple upload
  sampleFile.mv(`${__dirname}/f/${fileUUID}/${sampleFile.name}`, function (
   err
  ) {
    if (err) {
      return res.status(500).send(err);
    }
  });
}

Kiam vi alŝutas plurajn dosierojn, express-fileupload stokas ilin en tabelo kaj mi eksciis, ke la plej rapida maniero detekti ĉu pluraj dosieroj estas alŝutitaj, evidente estas kontroli ĉu la sendi dosieron estas tabelo aŭ ne. Kiel vi povas imagi, ĝi funkcias perfekte do mi konservis ĉi tiun unuan parton de spageta kodo.

Mia dua atingo estis kiel montri dosieron aŭ dosierujon al fina uzanto. La kodo aspektas tiel:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
app.get("/f/:uuid", async (req, res, next) => {
  var getUUID = req.params.uuid;

  let files = [];
  let imgFormats = ["png", "jpg", "jpeg", "gif", "webm"];

  try {
    fs.readdirSync(`${__dirname}/f/${getUUID}/`).forEach((file) => {
      files.push(file);
    });
  } catch (e) {
    return res.redirect("/");
  }

  await redisClient.get(getUUID, function (err, response) {
    if (response != null) {
      return res.status(301).redirect(`/auth?g=${getUUID}`);
    } else {
      res.render("view", {
        files: files,
        curUUID: getUUID,
        imgFormats: imgFormats,
        hostname: process.env.HOSTNAME,
      });
    }
  });

});

Por pli bone kompreni ĉi tiun kodon, vi unue devas scii kiel funkcias la dosiero alŝutita. Jen kiel:

  1. Je la komenco de la aplikaĵo, dosierujo nomata f estas kreita (f por dosieroj), ĝi estos kie ni konservos niajn dosierojn.
  2. Afiŝa peto enhavanta la dosierojn estas farita al la adreso / up, se la servilo detektas neniujn dosierojn aŭ dosieron tro grandan, ĝi faros escepton
  3. Hazarda UUID estas kreita kaj la dosierujo f estas kontrolita por vidi ĉu ĉi tiu UUID jam ekzistas, se ĝi ekzistas (kio estas plejparte neverŝajna), ĝi re-generas unu, kontrolas ĝin ktp.
  4. La servilo tiam kontrolas ĉu pluraj dosieroj estis alŝutitaj, se jes, ĝi ankaŭ kontrolos la kontrolajn sumojn de la dosieroj por vidi ĉu la sama dosiero estis alŝutita plurfoje.
  5. Se ĉio bonas, la dosierujo nomata laŭ la UUID estas kreita kaj la dosieroj estas movitaj en ĝin kaj tiam la servilo redirektas la uzanton al la dosierujo paĝo situanta ĉe / f / UUID

Post tio, kiam la uzanto faras peton al / f / UUID, la servilo kontrolos la dosierujon f por unue vidi ĉu la UUID ekzistas. Poste la servilo rigardas en la dosierujon por vidi ĉu estas dosieroj en ĝi, se la dosierujo ne ekzistas / estas malplena, la uzanto estos redirektita al la ĉefa paĝo. La servilo tiam listigas dosierojn, enmetas kaj enmetas ilin kaj la paĝo montriĝas. Ankaŭ, en kazo de pasvorto, la servilo redirektos al aŭtentopaĝo. Montrante la paĝon, la servilo kreos tabelon de bildformato, kiu estos montrata en etikedo “” nur por ke la paĝo estu iom pli ŝatata. Mi bezonis iom da tempo por krei ĉi tiun sistemon, sed fine mi estas kontenta pri la rezulto.

Mia lasta atingo estas la integriĝo de Docker. Mi pensas, ke Docker faciligas disfaldi programojn kiel tezojn kaj estis grave por mi, ke mi provizus rapidan kaj facilan manieron disfaldi mian programon.

Kiel nun, jen la ecoj de Magikfiles:

  • Dosiera alŝuto (obeeme)
  • Dosierujo
  • Kunhavigi dosierujon
  • Kunhavigi URL-dosieron
  • Dosierujoj kun pasvorto
  • Tutmondaj grandecoj de dosieroj

Mi nun laboras pri la sekva eldono, kiu efektivigos kodojn por alŝuti dosierojn. Ĝi probable estos la lasta eldono kaj post ĝi, la repositorio estos arkivita.

Se vi volas helpi, la repo estas nuntempe gastigita ĉe Github.

Jen ĉio por hodiaŭ. Ni revidos vin venontfoje!