You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

229 lines
6.3 KiB

11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
  1. const multer = require("multer");
  2. const path = require("path");
  3. const fs = require("fs");
  4. const { v4 } = require("uuid");
  5. const { normalizePath } = require(".");
  6. /**
  7. * Handle File uploads for auto-uploading.
  8. * Mostly used for internal GUI/API uploads.
  9. */
  10. const fileUploadStorage = multer.diskStorage({
  11. destination: function (_, __, cb) {
  12. console.log("进来了进来了进来了::::",process.env.NODE_ENV);
  13. const uploadOutput =
  14. process.env.NODE_ENV === "development"
  15. ? path.resolve(__dirname, `../../../collector/hotdir`)
  16. : path.resolve(process.env.STORAGE_DIR, `../../collector/hotdir`);
  17. console.log("又来了又来了又来了:::",uploadOutput)
  18. cb(null, uploadOutput);
  19. },
  20. filename: function (_, file, cb) {
  21. file.originalname = normalizePath(
  22. Buffer.from(file.originalname, "latin1").toString("utf8")
  23. );
  24. cb(null, file.originalname);
  25. },
  26. });
  27. /**
  28. * Handle API file upload as documents - this does not manipulate the filename
  29. * at all for encoding/charset reasons.
  30. */
  31. const fileAPIUploadStorage = multer.diskStorage({
  32. destination: function (_, __, cb) {
  33. const uploadOutput =
  34. process.env.NODE_ENV === "development"
  35. ? path.resolve(__dirname, `../../../collector/hotdir`)
  36. : path.resolve(process.env.STORAGE_DIR, `../../collector/hotdir`);
  37. cb(null, uploadOutput);
  38. },
  39. filename: function (_, file, cb) {
  40. file.originalname = normalizePath(file.originalname);
  41. cb(null, file.originalname);
  42. },
  43. });
  44. // Asset storage for logos
  45. const assetUploadStorage = multer.diskStorage({
  46. destination: function (_, __, cb) {
  47. const uploadOutput =
  48. process.env.NODE_ENV === "development"
  49. ? path.resolve(__dirname, `../../storage/assets`)
  50. : path.resolve(process.env.STORAGE_DIR, "assets");
  51. fs.mkdirSync(uploadOutput, { recursive: true });
  52. return cb(null, uploadOutput);
  53. },
  54. filename: function (_, file, cb) {
  55. file.originalname = normalizePath(
  56. Buffer.from(file.originalname, "latin1").toString("utf8")
  57. );
  58. cb(null, file.originalname);
  59. },
  60. });
  61. /**
  62. * Handle PFP file upload as logos
  63. */
  64. const pfpUploadStorage = multer.diskStorage({
  65. destination: function (_, __, cb) {
  66. const uploadOutput =
  67. process.env.NODE_ENV === "development"
  68. ? path.resolve(__dirname, `../../storage/assets/pfp`)
  69. : path.resolve(process.env.STORAGE_DIR, "assets/pfp");
  70. fs.mkdirSync(uploadOutput, { recursive: true });
  71. return cb(null, uploadOutput);
  72. },
  73. filename: function (req, file, cb) {
  74. const randomFileName = `${v4()}${path.extname(
  75. normalizePath(file.originalname)
  76. )}`;
  77. req.randomFileName = randomFileName;
  78. cb(null, randomFileName);
  79. },
  80. });
  81. /**
  82. * Handle Generic file upload as documents from the GUI
  83. * @param {Request} request
  84. * @param {Response} response
  85. * @param {NextFunction} next
  86. */
  87. function handleFileUpload(request, response, next) {
  88. const upload = multer({ storage: fileUploadStorage }).single("file");
  89. upload(request, response, function (err) {
  90. if (err) {
  91. response
  92. .status(500)
  93. .json({
  94. success: false,
  95. error: `Invalid file upload. ${err.message}`,
  96. })
  97. .end();
  98. return;
  99. }
  100. next();
  101. });
  102. }
  103. /**
  104. * Handle API file upload as documents - this does not manipulate the filename
  105. * at all for encoding/charset reasons.
  106. * @param {Request} request
  107. * @param {Response} response
  108. * @param {NextFunction} next
  109. */
  110. function handleAPIFileUpload(request, response, next) {
  111. const upload = multer({ storage: fileAPIUploadStorage }).single("file");
  112. upload(request, response, function (err) {
  113. if (err) {
  114. response
  115. .status(500)
  116. .json({
  117. success: false,
  118. error: `Invalid file upload. ${err.message}`,
  119. })
  120. .end();
  121. return;
  122. }
  123. next();
  124. });
  125. }
  126. /**
  127. * Handle logo asset uploads
  128. */
  129. function handleAssetUpload(request, response, next) {
  130. const upload = multer({ storage: assetUploadStorage }).single("logo");
  131. upload(request, response, function (err) {
  132. if (err) {
  133. response
  134. .status(500)
  135. .json({
  136. success: false,
  137. error: `Invalid file upload. ${err.message}`,
  138. })
  139. .end();
  140. return;
  141. }
  142. next();
  143. });
  144. }
  145. /**
  146. * Handle PFP file upload as logos
  147. */
  148. function handlePfpUpload(request, response, next) {
  149. const upload = multer({ storage: pfpUploadStorage }).single("file");
  150. upload(request, response, function (err) {
  151. if (err) {
  152. response
  153. .status(500)
  154. .json({
  155. success: false,
  156. error: `Invalid file upload. ${err.message}`,
  157. })
  158. .end();
  159. return;
  160. }
  161. next();
  162. });
  163. }
  164. // 文件存储配置
  165. const commUploadStorage = multer.diskStorage({
  166. destination: async function (_, __, cb) {
  167. try {
  168. // const uploadOutput = "D:\\code2\\anything-llm-master\\server\\storage\\real";
  169. console.log("进来了进来了进来了::::",process.env.NODE_ENV);
  170. const uploadOutput =
  171. process.env.NODE_ENV === "development"
  172. ? path.resolve(__dirname, `../../../server/storage/localFile`)
  173. : path.resolve(process.env.STORAGE_DIR, `../../server/storage/localFile`);
  174. console.log("又来了又来了又来了:::",uploadOutput)
  175. if (process.env.NODE_ENV !== "development" && !process.env.STORAGE_DIR) {
  176. throw new Error("STORAGE_DIR environment variable is required in production.");
  177. }
  178. fs.mkdirSync(uploadOutput, { recursive: true });
  179. cb(null, uploadOutput);
  180. } catch (err) {
  181. cb(err);
  182. }
  183. },
  184. filename: function (req, file, cb) {
  185. const randomFileName = `${v4()}${path.extname(file.originalname)}`;
  186. req.randomFileName = randomFileName;
  187. cb(null, randomFileName);
  188. },
  189. });
  190. // 文件上传中间件
  191. function handleCommUpload(request, response, next) {
  192. console.log("进来了进来了");
  193. const upload = multer({ storage: commUploadStorage, limits: { fileSize: 100 * 1024 * 1024 }, }).single("file");
  194. upload(request, response, function (err) {
  195. console.log("handleCommUpload", err);
  196. if (err) {
  197. response
  198. .status(500)
  199. .json({
  200. success: false,
  201. error: `Invalid file upload. ${err.message}`,
  202. })
  203. .end();
  204. return;
  205. }
  206. next();
  207. });
  208. }
  209. module.exports = {
  210. handleFileUpload,
  211. handleAPIFileUpload,
  212. handleAssetUpload,
  213. handlePfpUpload,
  214. handleCommUpload,
  215. };