我正在编写一个Java Web服务,可以在其中上传3D对象,对其进行操作并存储它。
我试图做的是创建一个<code>AIScene作为输入参数,即文件本身(它的内容)。
我在文档中找不到这样做的方法,所有导入方法都需要路径。
现在,我要看一下Assimp的lwjgl
java版本和C版本。用哪一个来解决这个问题并不重要。
编辑:我试图完成的代码:
@Override
public String uploadFile(MultipartFile file) {
AIFileIO fileIo = AIFileIO.create();
AIFileOpenProcI fileOpenProc = new AIFileOpenProc() {
public long invoke(long pFileIO, long fileName, long openMode) {
AIFile aiFile = AIFile.create();
final ByteBuffer data;
try {
data = ByteBuffer.wrap(file.getBytes());
} catch (IOException e) {
throw new RuntimeException();
}
AIFileReadProcI fileReadProc = new AIFileReadProc() {
public long invoke(long pFile, long pBuffer, long size, long count) {
long max = Math.min(data.remaining(), size * count);
memCopy(memAddress(data) + data.position(), pBuffer, max);
return max;
}
};
AIFileSeekI fileSeekProc = new AIFileSeek() {
public int invoke(long pFile, long offset, int origin) {
if (origin == Assimp.aiOrigin_CUR) {
data.position(data.position() + (int) offset);
} else if (origin == Assimp.aiOrigin_SET) {
data.position((int) offset);
} else if (origin == Assimp.aiOrigin_END) {
data.position(data.limit() + (int) offset);
}
return 0;
}
};
AIFileTellProcI fileTellProc = new AIFileTellProc() {
public long invoke(long pFile) {
return data.limit();
}
};
aiFile.ReadProc(fileReadProc);
aiFile.SeekProc(fileSeekProc);
aiFile.FileSizeProc(fileTellProc);
return aiFile.address();
}
};
AIFileCloseProcI fileCloseProc = new AIFileCloseProc() {
public void invoke(long pFileIO, long pFile) {
/* Nothing to do */
}
};
fileIo.set(fileOpenProc, fileCloseProc, NULL);
AIScene scene = aiImportFileEx(file.getName(),
aiProcess_JoinIdenticalVertices | aiProcess_Triangulate, fileIo); // ISSUE HERE. file.getName() is not a path, just a name. so is getOriginalName() in my case.
try{
Long id = scene.mMeshes().get(0);
AIMesh mesh = AIMesh.create(id);
AIVector3D vertex = mesh.mVertices().get(0);
return mesh.mName().toString() + ": " + (vertex.x() + " " + vertex.y() + " " + vertex.z());
}catch(Exception e){
e.printStackTrace();
}
return "fail";
}
调试方法时,我在绑定到本机的方法中发现了访问冲突:
public static long naiImportFileEx(long pFile, int pFlags, long pFS)
这是信息:
#
#
#
#
#
#
#
这是可能的,如果我们使用aiMatryFileFromMemory
方法。
我想遵循的方法是从github演示中复制的,实际上不必要地复制了缓冲区。
访问冲突的原因是使用了间接缓冲区(要了解为什么这是一个问题,请查看此处)。
解决方案远没有我最初粘贴的代码复杂:
@Override
public String uploadFile(MultipartFile file) throws IOException {
ByteBuffer buffer = BufferUtils.createByteBuffer((int) file.getSize());
buffer.put(file.getBytes());
buffer.flip();
AIScene scene = Assimp.aiImportFileFromMemory(buffer,aiProcess_Triangulate, (ByteBuffer) null);
Long id = scene.mMeshes().get(0);
AIMesh mesh = AIMesh.create(id);
AIVector3D vertex = mesh.mVertices().get(0);
return mesh.mName().dataString() + ": " + (vertex.x() + " " + vertex.y() + " " + vertex.z());
}
在这里,我创建了一个具有适当大小的直接缓冲区,加载数据并翻转它(这一部分是必须的)。之后,让Assimp发挥它的魔力,这样就可以获得指向结构的指针。使用<code>return<code>语句,我只检查是否获得了有效数据。
编辑
正如在评论中指出的那样,此实现仅限于单个文件上传,并假设它从那个MultipartFile
中获取所需的所有内容,它无法很好地处理引用的格式。有关更多详细信息,请参阅文档。
在问题注释中链接的演示在问题中用作基础,其用例与我的原始用例不同。
本文向大家介绍Python创建文件和追加文件内容实例,包括了Python创建文件和追加文件内容实例的使用技巧和注意事项,需要的朋友参考一下 一、用Python创建一个新文件,内容是从0到9的整数, 每个数字占一行: 二、文件内容追加,从0到9的10个随机整数: 三、文件内容追加,从0到9的随机整数, 10个数字一行,共10行: 四、把标准输出定向到文件: 例子: 查看22端口情况,并将结果写入a.
问题内容: 我已经在下面使用过一段时间了。至少在我访问过的网站上,它似乎是分布最广的。 在Java中,是否有更好/不同的方式将文件读取为字符串? 问题答案: 读取文件中的所有文本 Java 11添加了方法来读取小文件,以String保留行终止符: 对于介于Java 7和11之间的版本,这是一个紧凑而健壮的习惯用法,它包装在实用程序方法中: 从文件中读取文本行 Java 7添加了一种便捷方法,可以将
本文向大家介绍Java创建文件且写入内容的方法,包括了Java创建文件且写入内容的方法的使用技巧和注意事项,需要的朋友参考一下 前两天在项目中因为要通过http请求获取一个比较大的json数据(300KB左右)并且保存,思来想去,最后还是决定将获取到的json数据以文件的形式保存下来,每次使用的时候去读取文件就可以了。 废话不多说了,直接上代码。 以下是代码截图,文章结尾会有完成的代码文件可供下载
假设我想从许多xmls中编写具有以下格式的文本输出。其中一些xml文件可能没有节点[name、age、schood]的值。 <学生> 因此,基本上我使用的是iu正在使用的一个xsl文件,并试图通过考虑这些类似格式的xml文件(具有不同的节点值)来生成输出。 但是我只需要将相应的输出写到具有特定条件的xml文件中。[假设有一个名称,因为有些xml文件不包含名称值]。 因此,如果我有5个xml文件要转
我有一个可执行JAR,其中有一个文件,我想从代码中打开java.io.文件实例(不是InputStream或其他任何东西...只是文件)。 它是一个maven项目,文件位于“src/main/resources/file.xxx”的根目录下。打包后,该文件位于jar的根目录下(已验证其存在)。 我的第一次尝试:FileNotFoundException 其他尝试:FileNotFoundExcep
是否有可能从内存中(而不是磁盘上)的文件创建ZipArchive。 以下是用例:多个文件在