Heim Web-Frontend js-Tutorial Ausführliche Erläuterung der Fälle zum Hoch- und Herunterladen von Koa2-Dateien

Ausführliche Erläuterung der Fälle zum Hoch- und Herunterladen von Koa2-Dateien

May 08, 2018 am 11:05 AM
koa2 详解

Dieses Mal werde ich Ihnen eine detaillierte Erklärung zum Datei-Upload geben. Was sind die Vorsichtsmaßnahmen für das Hochladen und Herunterladen von Koa2-Dateien? Werfen wir einen Blick darauf.

Vorwort

Uploads und Downloads kommen in Webanwendungen recht häufig vor, egal ob es sich um Bilder oder andere Dateien handelt. In Koa gibt es viele Middleware, die uns helfen können, Funktionen schnell zu implementieren.

Datei-Upload

Wenn wir Dateien im Frontend hochladen, laden wir sie über Formulare hoch, aber die hochgeladenen Dateien können nicht wie normale Parameter auf dem Server über ctx weitergeleitet werden Seite. .request.body erhält. Wir können die Koa-Body-Middleware verwenden, um das Hochladen von Dateien zu verwalten, wodurch der Anforderungstext in ctx.request abgelegt werden kann.

// app.js
const koa = require('koa');
const app = new koa();
const koaBody = require('koa-body');
app.use(koaBody({
  multipart: true,
  formidable: {
    maxFileSize: 200*1024*1024 // 设置上传文件大小最大限制,默认2M
  }
}));
app.listen(3001, ()=>{
  console.log('koa is listening in 3001');
})
Nach dem Login kopieren
Nachdem Sie die Middleware verwendet haben, können Sie den hochgeladenen Dateiinhalt in ctx.request.body.files abrufen. Es muss darauf geachtet werden, maxFileSize festzulegen, andernfalls wird ein Fehler gemeldet, sobald die hochgeladene Datei das Standardlimit überschreitet.

Nach Erhalt der Datei müssen wir die Datei im Verzeichnis speichern und eine URL an das Frontend zurückgeben. Der Prozess im Knoten ist

  1. Erstellen Sie einen lesbaren Stream-Const-Reader = fs.createReadStream(file.path)

  2. Erstellen Sie einen beschreibbaren Stream-Const-Writer = fs.createWriteStream('upload/newpath.txt')

  3. Der lesbare Stream schreibt den beschreibbaren Stream über die Pipe reader.pipe(writer)

  4. const router = require('koa-router')();
    const fs = require('fs');
    router.post('/upload', async (ctx){
     const file = ctx.request.body.files.file; // 获取上传文件
     const reader = fs.createReadStream(file.path); // 创建可读流
     const ext = file.name.split('.').pop(); // 获取上传文件扩展名
     const upStream = fs.createWriteStream(`upload/${Math.random().toString()}.${ext}`); // 创建可写流
     reader.pipe(upStream); // 可读流通过管道写入可写流
     return ctx.body = '上传成功';
    })
    Nach dem Login kopieren
Diese Methode eignet sich zum Hochladen von Bildern, Textdateien, komprimierten Dateien usw.

Datei-Download

koa-send ist eine statische Dateidienst-Middleware, die zur Implementierung der Datei-Download-Funktion verwendet werden kann.

const router = require('koa-router')();
const send = require('koa-send');
router.post('/download/:name', async (ctx){
 const name = ctx.params.name;
 const path = `upload/${name}`;
 ctx.attachment(path);
  await send(ctx, path);
})
Nach dem Login kopieren
Es gibt zwei Methoden zum Herunterladen im Frontend:

window.open und Formularübermittlung. Hier wird das einfachere window.open verwendet.

<button onclick="handleClick()">立即下载</button>
<script>
 const handleClick = () => {
 window.open('/download/1.png');
 }
</script>
Nach dem Login kopieren
Die Standardeinstellung von window.open besteht darin, ein neues Fenster zu öffnen, zu blinken und dann zu schließen, was dem Benutzer kein gutes Erlebnis bietet. Sie können den zweiten Parameter window.open('/download/1 hinzufügen .png ', '_self'); , sodass es direkt im aktuellen Fenster heruntergeladen wird. Dadurch wird jedoch die aktuelle Seite durch die URL ersetzt, wodurch Seitenereignisse wie beforeunload ausgelöst werden. Wenn Ihre Seite auf dieses Ereignis lauscht und einige Vorgänge ausführt, hat dies Auswirkungen. Dann können Sie auch ein verstecktes Iframe-Fenster verwenden, um den gleichen Effekt zu erzielen.

<button onclick="handleClick()">立即下载</button>
<iframe name="myIframe" style="display:none"></iframe>
<script>
 const handleClick = () => {
 window.open('/download/1.png', 'myIframe');
 }
</script>
Nach dem Login kopieren

Batch-Download

Es gibt keinen Unterschied zwischen Batch-Download und Einzel-Download. Führen Sie einfach mehrere weitere Downloads durch. Damit gibt es wirklich kein Problem. Wäre das Erlebnis nicht besser, wenn Sie so viele Dateien in ein komprimiertes Paket packen und dann nur dieses komprimierte Paket herunterladen würden?

Dateiverpackung

Archiver ist ein Modul, das plattformübergreifende Verpackungsfunktionen in Node.js realisieren kann und ZIP- und TAR-Formate unterstützt.

const router = require('koa-router')();
const send = require('koa-send');
const archiver = require('archiver');
router.post('/downloadAll', async (ctx){
 // 将要打包的文件列表
 const list = [{name: '1.txt'},{name: '2.txt'}];
 const zipName = '1.zip';
 const zipStream = fs.createWriteStream(zipName);
  const zip = archiver('zip');
  zip.pipe(zipStream);
 for (let i = 0; i < list.length; i++) {
 // 添加单个文件到压缩包
 zip.append(fs.createReadStream(list[i].name), { name: list[i].name })
 }
 await zip.finalize();
 ctx.attachment(zipName);
 await send(ctx, zipName);
})
Nach dem Login kopieren
Wenn Sie den gesamten Ordner direkt verpacken, ist es nicht erforderlich, jede Datei zu durchlaufen und an das komprimierte Paket anzuhängen.

const zipStream = fs.createWriteStream('1.zip');
const zip = archiver('zip');
zip.pipe(zipStream);
// 添加整个文件夹到压缩包
zip.directory('upload/');
zip.finalize();
Nach dem Login kopieren
Hinweis: Beim Verpacken des gesamten Ordners wird die generierte komprimierte Paketdatei generiert kann nicht in diesem Ordner gespeichert werden, da es sonst kontinuierlich gepackt wird.

Probleme mit der chinesischen Kodierung

Wenn der Dateiname Chinesisch enthält, können unerwartete Situationen auftreten. Wenn es also beim Hochladen chinesische Zeichen enthält, kodiere ich den Dateinamen mit encodeURI(), um ihn zu speichern, und entschlüssele ihn dann beim Herunterladen mit decodeURI().

ctx.attachment(decodeURI(path));
await send(ctx, path);
Nach dem Login kopieren
ctx.attachment Setzen Sie Content-Disposition auf „attachment“, um den Client anzuweisen, zum Download aufzufordern. Verwenden Sie den entschlüsselten Dateinamen als Namen der herunterzuladenden Datei, sodass beim lokalen Herunterladen weiterhin der chinesische Name angezeigt wird.

Im Quellcode von koa-send wird der Dateipfad jedoch mit decodeURIComponent() dekodiert:

// koa-send
path = decode(path)
function decode (path) {
 try {
  return decodeURIComponent(path)
 } catch (err) {
  return -1
 }
}
Nach dem Login kopieren
Laden Sie zu diesem Zeitpunkt nach der Dekodierung den Pfad herunter, der Chinesisch enthält Pfad auf unserem Server gespeichert Da es sich um einen verschlüsselten Pfad handelt, kann die entsprechende Datei natürlich nicht gefunden werden.

Um dieses Problem zu lösen, lassen Sie es nicht entschlüsseln. Wenn Sie den Koa-Send-Quellcode nicht berühren möchten, können Sie stattdessen eine andere Middleware-Koa-Sendfile verwenden.

const router = require('koa-router')();
const sendfile = require('koa-sendfile');
router.post('/download/:name', async (ctx){
 const name = ctx.params.name;
 const path = `upload/${name}`;
 ctx.attachment(decodeURI(path));
  await sendfile(ctx, path);
})
Nach dem Login kopieren
Ich glaube, dass Sie die Methode beherrschen, nachdem Sie den Fall in diesem Artikel gelesen haben. Weitere spannende Informationen finden Sie in anderen verwandten Artikeln auf der chinesischen PHP-Website!

Empfohlene Lektüre:

So implementieren Sie Observer in Vue

vue.js element-ui Tree Tree Control So ändern Sie iview

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung der Fälle zum Hoch- und Herunterladen von Koa2-Dateien. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat -Befehle und wie man sie benutzt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Detaillierte Erläuterung der Modusfunktion in C++ Detaillierte Erläuterung der Modusfunktion in C++ Nov 18, 2023 pm 03:08 PM

Detaillierte Erläuterung der Modusfunktion in C++ In der Statistik bezieht sich der Modus auf den Wert, der in einem Datensatz am häufigsten vorkommt. In der Sprache C++ können wir den Modus in jedem Datensatz finden, indem wir eine Modusfunktion schreiben. Die Modusfunktion kann auf viele verschiedene Arten implementiert werden. Zwei der häufig verwendeten Methoden werden im Folgenden ausführlich vorgestellt. Die erste Methode besteht darin, eine Hash-Tabelle zu verwenden, um die Häufigkeit des Vorkommens jeder Zahl zu zählen. Zuerst müssen wir eine Hash-Tabelle definieren, in der jede Zahl der Schlüssel und die Häufigkeit des Vorkommens der Wert ist. Dann führen wir für einen bestimmten Datensatz aus

Ausführliche Erklärung zur Erlangung von Administratorrechten in Win11 Ausführliche Erklärung zur Erlangung von Administratorrechten in Win11 Mar 08, 2024 pm 03:06 PM

Das Windows-Betriebssystem ist eines der beliebtesten Betriebssysteme der Welt und seine neue Version Win11 hat viel Aufmerksamkeit erregt. Im Win11-System ist die Erlangung von Administratorrechten ein wichtiger Vorgang. Mit Administratorrechten können Benutzer weitere Vorgänge und Einstellungen auf dem System durchführen. In diesem Artikel wird ausführlich beschrieben, wie Sie Administratorrechte im Win11-System erhalten und wie Sie Berechtigungen effektiv verwalten. Im Win11-System werden Administratorrechte in zwei Typen unterteilt: lokaler Administrator und Domänenadministrator. Ein lokaler Administrator verfügt über vollständige Administratorrechte für den lokalen Computer

Detaillierte Erläuterung der Divisionsoperation in Oracle SQL Detaillierte Erläuterung der Divisionsoperation in Oracle SQL Mar 10, 2024 am 09:51 AM

Detaillierte Erläuterung der Divisionsoperation in OracleSQL In OracleSQL ist die Divisionsoperation eine häufige und wichtige mathematische Operation, die zur Berechnung des Ergebnisses der Division zweier Zahlen verwendet wird. Division wird häufig in Datenbankabfragen verwendet. Daher ist das Verständnis der Divisionsoperation und ihrer Verwendung in OracleSQL eine der wesentlichen Fähigkeiten für Datenbankentwickler. In diesem Artikel werden die relevanten Kenntnisse über Divisionsoperationen in OracleSQL ausführlich erörtert und spezifische Codebeispiele als Referenz für die Leser bereitgestellt. 1. Divisionsoperation in OracleSQL

Detaillierte Erläuterung der Restfunktion in C++ Detaillierte Erläuterung der Restfunktion in C++ Nov 18, 2023 pm 02:41 PM

Detaillierte Erläuterung der Restfunktion in C++ In C++ wird der Restoperator (%) verwendet, um den Rest der Division zweier Zahlen zu berechnen. Es handelt sich um einen binären Operator, dessen Operanden ein beliebiger Ganzzahltyp (einschließlich char, short, int, long usw.) oder ein Gleitkommazahlentyp (z. B. float, double) sein kann. Der Restoperator gibt ein Ergebnis mit demselben Vorzeichen wie der Dividend zurück. Für die Restoperation von Ganzzahlen können wir beispielsweise den folgenden Code zur Implementierung verwenden: inta=10;intb=3;

Detaillierte Erläuterung der Verwendung der Vue.nextTick-Funktion und ihrer Anwendung bei asynchronen Updates Detaillierte Erläuterung der Verwendung der Vue.nextTick-Funktion und ihrer Anwendung bei asynchronen Updates Jul 26, 2023 am 08:57 AM

Detaillierte Erläuterung der Verwendung der Vue.nextTick-Funktion und ihrer Anwendung bei asynchronen Aktualisierungen. Bei der Vue-Entwicklung treten häufig Situationen auf, in denen Daten asynchron aktualisiert werden müssen. Beispielsweise müssen Daten sofort nach einer Änderung des DOM oder verwandter Vorgänge aktualisiert werden unmittelbar nach der Aktualisierung der Daten durchzuführen. Die von Vue bereitgestellte Funktion .nextTick wurde entwickelt, um diese Art von Problem zu lösen. In diesem Artikel wird die Verwendung der Vue.nextTick-Funktion im Detail vorgestellt und mit Codebeispielen kombiniert, um ihre Anwendung bei asynchronen Updates zu veranschaulichen. 1. Vue.nex

Detaillierte Erläuterung der PHP-FPM-Optimierungsmethode Detaillierte Erläuterung der PHP-FPM-Optimierungsmethode Jul 08, 2023 pm 04:31 PM

PHP-FPM ist ein häufig verwendeter PHP-Prozessmanager, der eine bessere PHP-Leistung und -Stabilität bietet. In einer Hochlastumgebung erfüllt die Standardkonfiguration von PHP-FPM jedoch möglicherweise nicht die Anforderungen, sodass wir sie optimieren müssen. In diesem Artikel wird die Optimierungsmethode von PHP-FPM ausführlich vorgestellt und einige Codebeispiele gegeben. 1. Erhöhen Sie die Anzahl der Prozesse. Standardmäßig startet PHP-FPM nur eine kleine Anzahl von Prozessen, um Anfragen zu bearbeiten. In einer Hochlastumgebung können wir die Parallelität von PHP-FPM erhöhen, indem wir die Anzahl der Prozesse erhöhen.

Detaillierte Erläuterung der Rolle und Verwendung des PHP-Modulo-Operators Detaillierte Erläuterung der Rolle und Verwendung des PHP-Modulo-Operators Mar 19, 2024 pm 04:33 PM

Der Modulo-Operator (%) in PHP wird verwendet, um den Rest der Division zweier Zahlen zu ermitteln. In diesem Artikel werden wir die Rolle und Verwendung des Modulo-Operators im Detail besprechen und spezifische Codebeispiele bereitstellen, um den Lesern ein besseres Verständnis zu erleichtern. 1. Die Rolle des Modulo-Operators Wenn wir in der Mathematik eine ganze Zahl durch eine andere ganze Zahl dividieren, erhalten wir einen Quotienten und einen Rest. Wenn wir beispielsweise 10 durch 3 dividieren, ist der Quotient 3 und der Rest ist 1. Um diesen Rest zu ermitteln, wird der Modulo-Operator verwendet. 2. Verwendung des Modulo-Operators In PHP verwenden Sie das %-Symbol, um den Modul darzustellen

Detaillierte Erläuterung der Funktion system() des Linux-Systemaufrufs Detaillierte Erläuterung der Funktion system() des Linux-Systemaufrufs Feb 22, 2024 pm 08:21 PM

Detaillierte Erläuterung der Funktion system() des Linux-Systems Der Systemaufruf ist ein sehr wichtiger Teil des Linux-Betriebssystems. Er bietet eine Möglichkeit, mit dem Systemkernel zu interagieren. Unter diesen ist die Funktion system() eine der am häufigsten verwendeten Systemaufruffunktionen. In diesem Artikel wird die Verwendung der Funktion system() ausführlich vorgestellt und entsprechende Codebeispiele bereitgestellt. Grundlegende Konzepte von Systemaufrufen Systemaufrufe sind eine Möglichkeit für Benutzerprogramme, mit dem Betriebssystemkernel zu interagieren. Benutzerprogramme fordern das Betriebssystem an, indem sie Systemaufruffunktionen aufrufen

See all articles