вот ошибка и код 3D-загрузчика и средства просмотра 3D-изображений из загруженного файла glb из Cloudinary
/>
Error: ENOENT: no such file or directory, open 'C:\Users\Albert\try\InternalBytecode.js'
at Object.openSync (node:fs:596:3)
at Object.readFileSync (node:fs:464:35)
at getCodeFrame (C:\Users\Albert\try\node_modules\metro\src\Server.js:997:18)
at Server._symbolicate (C:\Users\Albert\try\node_modules\metro\src\Server.js
at Server._processRequest (C:\Users\Albert\try\node_modules\metro\src\Server.js:460:7) {
errno: -4058,
syscall: 'open',
code: 'ENOENT',
path: 'C:\\Users\\Albert\\try\\InternalBytecode.js'
}
Error: ENOENT: no such file or directory, open 'C:\Users\Albert\try\InternalBytecode.js'
at Object.openSync (node:fs:596:3)
at Object.readFileSync (node:fs:464:35)
at getCodeFrame (C:\Users\Albert\try\node_modules\metro\src\Server.js:997:18)
at Server._symbolicate (C:\Users\Albert\try\node_modules\metro\src\Server.js
at Server._processRequest (C:\Users\Albert\try\node_modules\metro\src\Server.js:460:7) {
errno: -4058,
syscall: 'open',
code: 'ENOENT',
path: 'C:\\Users\\Albert\\try\\InternalBytecode.js'
}
ERROR
Call Stack
GLTFParser#constructor (node_modules\three\examples\jsm\loaders\GLTFLoader.js)
parse (node_modules\three\examples\jsm\loaders\GLTFLoader.js)
loadModel (app\cloud3dViewer.jsx)
next ()
asyncGeneratorStep (node_modules\@babel\runtime\helpers\asyncToGenerator.js)
_next (node_modules\@babel\runtime\helpers\asyncToGenerator.js)
tryCallOne (address at (InternalBytecode.js:1:1180)
anonymous (address at (InternalBytecode.js:1:1874)
import * as DocumentPicker from "expo-document-picker";
import { useState } from "react";
import { ActivityIndicator, Text, TouchableOpacity, View } from "react-native";
import { SafeAreaView } from "react-native-safe-area-context";
import Cloud3DViewer from "./cloud3dViewer";
export default function Upload3DModel() {
const [uploading, setUploading] = useState(false);
const [fileUrl, setFileUrl] = useState(null);
const CLOUDINARY_URL = "https://api.cloudinary.com/v1_1/djzitiwoc/raw/upload";
const UPLOAD_PRESET = "mobile-upload";
async function pickAndUploadFile() {
try {
const result = await DocumentPicker.getDocumentAsync({
type: ["model/gltf-binary", "application/octet-stream"],
});
if (result.canceled) return;
const file = result.assets[0];
console.log("
setUploading(true);
const formData = new FormData();
formData.append("file", {
uri: file.uri,
type: file.mimeType || "model/gltf-binary",
name: file.name || "3dmodel.glb",
});
formData.append("upload_preset", UPLOAD_PRESET);
//
const response = await fetch(CLOUDINARY_URL, {
method: "POST",
body: formData,
});
const data = await response.json();
console.log("
if (data.secure_url) {
//
const fixedUrl = data.secure_url.replace(
"/upload/",
"/upload/fl_attachment/"
);
setFileUrl(fixedUrl);
alert("
} else {
alert("
console.error("Upload failed:", data);
}
} catch (error) {
console.error("
alert("
} finally {
setUploading(false);
}
}
return (
Upload 3D Model
{uploading && (
)}
{fileUrl && (
{fileUrl}
)}
);
}
import React, { useEffect, useState, Suspense } from "react";
import { View, ActivityIndicator, Text } from "react-native";
import { Canvas } from "@react-three/fiber/native";
import { OrbitControls } from "@react-three/drei/native";
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";
import * as THREE from "three";
export default function Cloud3DViewer({ modelUrl }) {
const [model, setModel] = useState(null);
const [error, setError] = useState(null);
const [loading, setLoading] = useState(false);
useEffect(() => {
if (!modelUrl) return;
const loadModel = async () => {
try {
console.log("
setLoading(true);
setError(null);
const response = await fetch(modelUrl, {
headers: { Accept: "application/octet-stream" },
});
if (!response.ok) throw new Error("Network response was not ok");
const arrayBuffer = await response.arrayBuffer();
const loader = new GLTFLoader();
loader.parse(
arrayBuffer,
"", //
(gltf) => {
console.log("
setModel(gltf.scene);
},
(parseError) => {
console.error("Loader parse error:", parseError);
setError("
}
);
} catch (err) {
console.error("
setError(err.message || "Unknown error while loading model");
} finally {
setLoading(false);
}
};
loadModel();
}, [modelUrl]);
if (!modelUrl)
return (
No model uploaded yet
);
return (
{loading && (
)}
{error && (
{error}
)}
{!error && (
{model && }
)}
);
}
import * as DocumentPicker from "expo-document-picker";
import { useState } from "react";
import { ActivityIndicator, Text, TouchableOpacity, View } from "react-native";
import { SafeAreaView } from "react-native-safe-area-context";
import Cloud3DViewer from "./cloud3dViewer";
export default function Upload3DModel() {
const [uploading, setUploading] = useState(false);
const [fileUrl, setFileUrl] = useState(null);
const CLOUDINARY_URL = "https://api.cloudinary.com/v1_1/djzitiwoc/raw/upload";
const UPLOAD_PRESET = "mobile-upload";
async function pickAndUploadFile() {
try {
const result = await DocumentPicker.getDocumentAsync({
type: ["model/gltf-binary", "application/octet-stream"],
});
if (result.canceled) return;
const file = result.assets[0];
console.log("
setUploading(true);
const formData = new FormData();
formData.append("file", {
uri: file.uri,
type: file.mimeType || "model/gltf-binary",
name: file.name || "3dmodel.glb",
});
formData.append("upload_preset", UPLOAD_PRESET);
//
const response = await fetch(CLOUDINARY_URL, {
method: "POST",
body: formData,
});
const data = await response.json();
console.log("
if (data.secure_url) {
//
const fixedUrl = data.secure_url.replace(
"/upload/",
"/upload/fl_attachment/"
);
setFileUrl(fixedUrl);
alert("
} else {
alert("
console.error("Upload failed:", data);
}
} catch (error) {
console.error("
alert("
} finally {
setUploading(false);
}
}
return (
Upload 3D Model
{uploading && (
)}
{fileUrl && (
{fileUrl}
)}
);
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... n-i-doi-it
Мобильная версия