2015-09-14 145 views
0

后我有一瓶“服务器”服务我。RAW格式块设备的图像。不幸的是,下载完成后(成功与否,无关紧要)我必须运行另一种方法来卸载导出的块设备。瓶运行的命令文件下载

下面我提供用于导出图像的代码,但只为我提供了错误的(不能去映射器,因为它是使用不同的工艺),并如预期未导出图像:

class ExportResponse(HTTPResponse): 
    def __init__(self, devpath, volume_name): 
     self.devpath = devpath 
     self.volume_name = volume_name 

     output_filename = "%s.raw" % (volume_name) 

     fp = open(devpath) 
     content_length = os.lseek(fp.fileno(), 0, os.SEEK_END) 
     os.lseek(fp.fileno(), 0, os.SEEK_SET) 
     headers = { 
       'Content-Length': str(content_length), 
       'Content-Type': "application/octet-stream", 
       'Content-Disposition': 'attachment; filename="%s"' % output_filename 
       } 
     log.info("%s, %s" % (os.SEEK_CUR, content_length)) 
     super(ExportResponse, self).__init__(fp, **headers) 

@get('/retrieve/<volume_name>/') 
def export_volume(volume_name): 
    fmt = request.query['format'] 
    dev = find_mapping(volume_name) 
    if dev: 
     log.debug("export, name=%s, already mapped dev=%s" % (repr(volume_name), str(dev))) 
    dev_owner = dev is None 
    try: 
     if not dev: 
      map_volume(volume_name) 
      dev = find_mapping(volume_name) 
      log.debug("export, name=%s, mapped to dev=%s" % (repr(volume_name), str(dev))) 
     return(ExportResponse(dev, volume_name)) 
    except: 
     log.exception("export, name=%s" % repr(volume_name)) 
     if dev and dev_owner: 
      unmap_volume(volume_name) 
     raise 
    finally: 
     unmap_volume(volume_name) 

是有没有这样做的好方法?

+0

'不能取消映射设备,因为它被不同的进程使用 - 为什么你希望'unmap'在其他进程正在使用时工作它? –

+0

这就是为什么我要求帮助,因为我不知道如何完成导出,然后取消映射设备。 –

+0

但你说它正在被一个不同的process_使用。所以这个问题与你自己的出口没有任何关系,对吧?其他一些进程一起使用磁盘。 –

回答

0

这样做有两种方式。

1)使用BytesIO对象读取整个图像到内存中。使用它作为流传递给__init__而不是实际文件的句柄。

2)从瓶中获取原始句柄响应流和使用上的流write()方法,当你完成写入文件自己的块,将其关闭。我不确定如何从瓶子中获得该流,但我知道它存在,因为WSGI protocol specifies the response is passed as a stream.