Chuyển tới nội dung chính

uploadFile

uploadFile là API dùng để upload file từ máy lên server.

Lưu ý

Chỉ thực hiện được việc upload các đường dẫn tạm thời của file ví dụ đường dẫn từ api chooseImage, downloadFile.

Ví dụ

Example bên dưới lấy ra 1 hình từ gallery và upload lên http://httpbin.org/post

import apis from '@v-miniapp/apis'

function onUploadFile() {
apis.chooseImage({
count: 1,
success: (res) => {
const path = res.filePaths[0];
console.log(path);
apis.uploadFile({
url: "http://httpbin.org/post",
fileType: "image/jpeg",
fileName: "file",
filePath: path,
success: (res) => {
console.log(res);
apis.alert({ title: "Upload success" });
},
fail: function (res) {
console.log(res);
apis.alert({ title: "Upload fail" });
},
});
},
});
}

function onUploadMultipleFiles() {
apis.chooseImage({
count: 1,
success: (res) => {
const paths = res.filePaths;
apis.uploadFile({
url: "http://httpbin.org/post",
fileType: "image/jpeg",
fileName: "files",
filePaths: path,
success: (res) => {
console.log(res);
apis.alert({ title: "Upload success" });
},
fail: function (res) {
console.log(res);
apis.alert({ title: "Upload fail" });
},
});
},
});
}

Tham số

Để cấu hình việc gọi network, bạn cần truyền object với các thuộc tính sau:

Thuộc tínhBắt buộcMô tả
urlstringĐường dẫn của server muốn upload
methodstringPhương thức gọi network. Mặc định sẽ là POST.
fileNamestringTên file của như sử dụng làm key trong form data, server sẽ lấy ra file từ field này
filePathstringĐường dẫn tạm thời của file
filePathsstring[]Trong trường hợp upload multiple files thì là mảng các đường dẫn của file
formDataFormDataCác field khác của form cần send khi upload file
fileTypestringMime type của file
headersObjectCấu hình headers khi thực hiện gọi network.
successFunctionCallback function khi việc upload file thành công.
failFunctionCallback function khi việc upload file thất bại.
completeFunctionCallback function khi việc upload file kết thúc cho dù thành công hay thất bại.

Success Callback function payload

Callback function payload

Thuộc tínhKiểu dữ liệuMô tả
dataStringDữ liệu đươc trả về từ server upload

Các lỗi hay gặp khi upload file.

  • File không tồn tại -> do đường dẫn không đúng.
  • Upload fail từ server-> có thể file quá lớn, hoặc ko có permission. 1 số server yêu cầu truyền authorization token, nên khi gọi uploadFile phải truyền thêm headers.
  • Trong formData có thể gửi giá trị base64 nhưng không nên lạm dụng vì sẽ khiến payload của việc upload tăng lên nhiều và việc upload có thể mất nhiều thời gian hơn.
  • Hiện chỉ cho upload file image, audio và video, và chỉ upload đươc 1 file/lần.

Tham khảo nodejs server

File server.js để test upload file(s) cho các develop phát triển miniapp

const express = require('express');
const multer = require('multer');
const path = require('path');
const fs = require('fs');
const cors = require('cors');
const helmet = require('helmet');
const morgan = require('morgan');
require('dotenv').config();

const app = express();
const PORT = process.env.PORT || 3003;

const uploadsDir = path.join(__dirname, 'uploads');
if (!fs.existsSync(uploadsDir)) {
fs.mkdirSync(uploadsDir, { recursive: true });
}

app.use(helmet({
contentSecurityPolicy: {
directives: {
defaultSrc: ["'self'"],
scriptSrc: ["'self'", "'unsafe-inline'"],
styleSrc: ["'self'", "'unsafe-inline'"],
imgSrc: ["'self'", "data:", "https:"],
},
},
}));
app.use(cors());
app.use(morgan('combined'));
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

app.use('/uploads', express.static('uploads'));
app.use(express.static('public'));

const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, 'uploads/')
},
filename: function (req, file, cb) {
const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
cb(null, file.fieldname + '-' + uniqueSuffix + path.extname(file.originalname));
}
});

const fileFilter = (req, file, cb) => {
cb(null, true);
};

const upload = multer({
storage: storage,
fileFilter: fileFilter,
limits: {
fileSize: 10 * 1024 * 1024 // 10MB limit
}
});

app.get('/', (req, res) => {
res.json({
message: 'File Upload Server',
version: '1.0.0',
endpoints: {
'POST /api/upload/single': 'Upload a single file',
'POST /api/upload/multiple': 'Upload multiple files',
'GET /api/files': 'List uploaded files',
'GET /uploads/:filename': 'Download/view uploaded file'
}
});
});

// Single file upload
app.post('/api/upload/single', upload.single('file'), (req, res) => {
try {
if (!req.file) {
return res.status(400).json({ error: 'No file uploaded' });
}

res.json({
message: 'File uploaded successfully',
file: {
originalName: req.file.originalname,
filename: req.file.filename,
mimetype: req.file.mimetype,
size: req.file.size,
url: `/uploads/${req.file.filename}`
}
});
} catch (error) {
res.status(500).json({ error: 'Upload failed', details: error.message });
}
});

// Multiple files upload
app.post('/api/upload/multiple', upload.array('files', 10), (req, res) => {
try {
if (!req.files || req.files.length === 0) {
return res.status(400).json({ error: 'No files uploaded' });
}

const uploadedFiles = req.files.map(file => ({
originalName: file.originalname,
filename: file.filename,
mimetype: file.mimetype,
size: file.size,
url: `/uploads/${file.filename}`
}));

res.json({
message: `${req.files.length} files uploaded successfully`,
files: uploadedFiles
});
} catch (error) {
res.status(500).json({ error: 'Upload failed', details: error.message });
}
});

// List uploaded files
app.get('/api/files', (req, res) => {
try {
const files = fs.readdirSync(uploadsDir);
const fileList = files.map(filename => {
const filePath = path.join(uploadsDir, filename);
const stats = fs.statSync(filePath);
return {
filename,
size: stats.size,
uploadDate: stats.birthtime,
url: `/uploads/${filename}`
};
});

res.json({
message: 'Files retrieved successfully',
count: fileList.length,
files: fileList
});
} catch (error) {
res.status(500).json({ error: 'Failed to retrieve files', details: error.message });
}
});

// 404 handler
app.use('*', (req, res) => {
res.status(404).json({ error: 'Route not found' });
});

// Start server
app.listen(PORT, () => {
console.log(`Server is running on http://localhost:${PORT}`);
console.log('Upload endpoints:');
console.log(` POST http://localhost:${PORT}/api/upload/single`);
console.log(` POST http://localhost:${PORT}/api/upload/multiple`);
console.log(` GET http://localhost:${PORT}/api/files`);
});

module.exports = app;