开发者社区> 问答> 正文

oss开发版续点上传修改

从 create_mpu_object   上传修改,坑爹啊,弄了好久
====修改部分,以下========
// 初始化multipart
        if (isset($options['uploadId'])){
            $uploadId = $options['uploadId'];
        }else{
            //初始化
            $upload = $this->initiate_multipart_upload($bucket, $object);
            
            if (!$upload->isOK()){
                throw new OSS_Exception('Init multi-part upload failed...');
            }
            $xml = new SimpleXmlIterator($upload->body);
            $uploadId = (string)$xml->UploadId;
        }        

        // 或的分片
        $pieces = $this->get_multipart_counts($upload_filesize, (integer) $options[self::OSS_PART_SIZE]);

        $uploadResList = array();
        $upload_part_result = true;
        $upload_parts = array();
        if (isset($options['upload_parts'])) {
            $upload_parts[] = $options['upload_parts'];
        }

        foreach ($pieces as $i => $piece){
            // if ($i==1) {//人为掏出异常,测试用
            //     throw new Exception(serialize($uploadResList), 1);
            // }
            if (isset($options['upload_parts']['PartNumber'])&&$options['upload_parts']['PartNumber']>=($i+1)) {
                continue;
            }
            $response_temp =  $this->upload_part($bucket, $object, $uploadId, array(
                //'expect' => '100-continue',
                self::OSS_FILE_UPLOAD => $options[self::OSS_FILE_UPLOAD],
                'partNumber' => ($i + 1),
                self::OSS_SEEK_TO => $upload_position + (integer) $piece[self::OSS_SEEK_TO],
                self::OSS_LENGTH => (integer) $piece[self::OSS_LENGTH],
            ));


            $upload_part_result = $upload_part_result && $response_temp->isOk();
            
            if(!$upload_part_result){
                throw new OSS_Exception(($i + 1).'any part upload failed...,pls try again');
            }

            $upload_parts[] = array(
                'PartNumber' => ($i + 1),
                'ETag' => (string) $response_temp->header['etag']
            );        

            //续点上传 上传参数
            $uploadResList['partNumber'] = ($i+1);
            $uploadResList['uploadId'] = $uploadId;
            $uploadResList['OSS_LENGTH'] = $piece[self::OSS_LENGTH];
            $uploadResList['OSS_SEEK_TO'] = $piece[self::OSS_SEEK_TO];
            $uploadResList['upload_parts'] = $upload_parts;
        }
        
        // $upload_parts = array();
        // $upload_part_result = true;
        
        // foreach ($response_upload_part as $i=>$response){
        //     $upload_part_result = $upload_part_result && $response->isOk();
        // }
        
        // if(!$upload_part_result){
        //     throw new OSS_Exception('any part upload failed...,pls try again');
        // }
        
        // foreach ($response_upload_part as $i=>$response){
        //     $upload_parts[] = array(
        //         'PartNumber' => ($i + 1),
        //         'ETag' => (string) $response->header['etag']
        //     );        
        // }

        return $this->complete_multipart_upload($bucket, $object, $uploadId, $upload_parts);

展开
收起
fengxiaowudi 2014-06-20 16:58:06 7903 0
3 条回答
写回答
取消 提交回答
  • Reoss开发版续点上传修改
    请问有没有js版的分片上传,或者怎么能够从response得到etag?

    我用 xhr.getAllResponseHeaders() 总是得到null,虽然浏览器里面能够看到response.

    -------------------------

    回 4楼(cloud_service) 的帖子
    感谢回复,仔细读了一下:
    1) 发现 php_post_object-jstest.tar.gz  没有权限下载。
    2) 如果使用了php sdk,是不是文件还是要先上传到PHP服务器,然后从服务器再上传到OSS?这样的话,如果我允许用户上传一个500兆的文件,我的服务器岂不是要消耗1G的流量?好吧,假设内部流量不花钱,但是我的服务器的负担还是挺重的。

    既然通过开启CORS,用户可以从浏览器直接上传文件到OSS,想问问MultiplartUpload能不能也这么实现?Web服务器只进行必要的权限控制,发送签名,但是不直接接收文件?
    2015-06-12 20:38:45
    赞同 展开评论 打赏
  • 感谢楼主分享开发经验啊,我们也会多加强这方面API开发技巧的普及。
    2014-06-20 17:16:03
    赞同 展开评论 打赏
  • 分享阿里云支持与服务团队最佳实践、经典案例与故障排查。
    非常感谢楼主的分享! 

    -------------------------

    回 3楼(被占用昵称) 的帖子
    您好,目前可以支持JS版分片上传,请您参考: http://bbs.aliyun.com/read/227466.html?spm=5176.7189909.0.0.olGFco  
    由于etag不是用来保证服务器端数据与本地数据一致性,而是用来判断服务器端数据是否存在变化,不建议您使用etag来验证数据的一致性。您可以在上传数据时携带content-MD5值,OSS服务器端会帮用户进行校验,来保证上传数据的一致性。
    2014-06-20 17:15:09
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
OSS运维进阶实战手册 立即下载
《OSS运维基础实战手册》 立即下载
OSS运维基础实战手册 立即下载