问题描述
我有一个Django Web应用程序,我正在尝试进行ajax调用以上传3D图像(如.stl,.stp等),以便使用pythonocc-core软件包获取其体积信息。当文件大小小于1 MB时,我将使用普通的ajax请求运行该文件,而当文件大小较大时,我将其作为后台任务运行,以免进程超时。
我的ajax请求;
var data = new FormData();
var img = $('#id_Volume')[0].files[0];
var img_size = (img.size / 1048576).toFixed(2);
data.append('img',img);
data.append('csrfmiddlewaretoken','{{ csrf_token }}');
if (img_size <= 1){
$.ajax({
method: 'POST',url: '{% url 'data:smallUpload' %}',type: 'POST',contentType: false,processData: false,data: data,}).done(function(data) {
$("#id_rectangleRemovedVolume").val(data['removed_volume']);
$("#id_rectangleVolume").val(data['volume']);
loader.style.display = 'none';
$("#id_Volume").val('');
}).fail(function(xhr,text,error) {
console.log(text,error)
});
} else {
$.ajax({
method: 'POST',url: '{% url 'data:upload' %}',}).done(function(data) {
window.location.href = "{% url 'data:uploadStatus' %}";
}).fail(function(xhr,error)
});
}
我的smallUpload视图;
def uploadSmallFile(request):
if request.POST or None:
file = request.FILES.get('img')
filename = file.name
key = 'media/' + filename
s3_resource = boto3.resource('s3')
bucket = s3_resource.Bucket('bucket')
bucket.put_object(Key=key,Body=file)
if filename != '':
volume,removed_volume = Methods.get_volume_info(key)
#do something
context = {'volume': volume,'removed_volume': removed_volume}
return JsonResponse(context)
我的get_volume_info函数;
@staticmethod
def get_volume_info(uploadedVolume):
s3 = boto3.resource('s3',region_name='eu-central-1')
bucket = s3.Bucket('bucket')
obj = bucket.Object(uploadedVolume)
tmp = tempfile.NamedTemporaryFile()
with open(tmp.name,'wb') as f:
obj.download_fileobj(f)
meshLoader = CADLoader(tmp.name,uploadedVolume)
volume = meshLoader.shape_volume()
Box_volume = meshLoader.shape_Box_volume()
rectangleVolume = "{0:.2f}".format(Box_volume)
rectangleRemovedVolume = "{0:.2f}".format(((Box_volume - volume) / Box_volume) * 100.0)
return rectangleVolume,rectangleRemovedVolume
当我上传一个小文件时,我可以向这个smallUpload视图发送请求,并毫无问题地获取卷信息。但是我想对.stl文件使用numpy-stl库,因为它比pythonocc更快。当我按如下所示向get_volume_info函数添加条件时,出现The view data.views.uploadSmallFile didn't return an HttpResponse object. It returned None instead.
错误。
新的get_volume_info函数;
@staticmethod
def get_volume_info(uploadedVolume):
s3 = boto3.resource('s3','wb') as f:
obj.download_fileobj(f)
if '.stl' in uploadedVolume.lower():
stl = STLLoaderClass(tmp.name)
rectangleVolume,rectangleRemovedVolume = stl.read_stl()
else:
meshLoader = CADLoader(tmp.name,uploadedVolume)
volume = meshLoader.shape_volume()
Box_volume = meshLoader.shape_Box_volume()
rectangleVolume = "{0:.2f}".format(Box_volume)
rectangleRemovedVolume = "{0:.2f}".format(((Box_volume - volume) / Box_volume) * 100.0)
return rectangleVolume,rectangleRemovedVolume
如上面的代码所示,当接收到扩展名为.stl的文件时,我将其发送到STLLoaderClass。通常,该类适用于我正在尝试的.stl文件,但是当我通过Ajax请求调用它时,该类不起作用。同样在我的日志中,有一条错误行,如下所示。
stl.base.BaseMesh - WARNING - Your mesh is not closed,the mass methods will not function
correctly on this mesh.
但是正如我所说,我尝试过的STLLoaderClass和.stl文件都可以正常工作。我该如何解决这个问题?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)