上载后Azure存储zip文件损坏(使用适用于Java的Azure存储Blob客户端库)

时间:2020-06-25 11:48:34

标签: azure file-upload azure-storage-blobs azure-blob-storage azure-sdk-for-java

问题:上传到Azure Blob存储后,包含从数据生成的csv文件的zip文件似乎已损坏。

上传前的zip文件如下:

enter image description here

,一切正常。上传后相同的zip文件已损坏,看起来像这样: enter image description here

在上载期间,我使用适用于Java的Azure Storage Blob客户端库(12.7.0版,但我也尝试了以前的版本)。这是我使用的代码(类似于SDK readme file中提供的示例):

public void uploadFileFromPath(String pathToFile, String blobName) {
     BlobClient blobClient = blobContainerClient.getBlobClient(blobName);
     blobClient.uploadFromFile(pathToFile);
}

然后我上传了文件:

enter image description here

当我直接从Storage Explorer中下载文件 时,文件已损坏。 我在做什么错了?

2 个答案:

答案 0 :(得分:1)

根据您的描述,建议您使用以下方法上传zip文件

public void uploadFromFile(String filePath, ParallelTransferOptions parallelTransferOptions, BlobHttpHeaders headers, Map<String,String> metadata, AccessTier tier, BlobRequestConditions requestConditions, Duration timeout)

我们可以使用该方法设置内容类型

例如

BlobHttpHeaders headers = new BlobHttpHeaders()
     .setContentType("application/x-zip-compressed");
 Integer blockSize = 4* 1024 * 1024; // 4MB;
 ParallelTransferOptions parallelTransferOptions = new ParallelTransferOptions(blockSize, null, null);
blobClient.uploadFromFile(pathToFile,parallelTransferOptions,headers,null, AccessTier.HOT, null, null);

有关更多详细信息,请参阅document

答案 1 :(得分:0)

最终这是我的错。上传文件之前,我没有关闭ZipOutputStream。当您对资源使用try并只想生成本地文件时,这并不是什么大问题。但就我而言,我想将文件上传到Blob存储(仍在try部分)。文件不完整(未关闭),因此它与损坏的数据一起出现在存储中。这是我从一开始就应该做的。

import React, { Component } from "react";
import { StyleSheet, View, Text } from "react-native";
import MapboxGL from "@react-native-mapbox-gl/maps";

MapboxGL.setAccessToken("pk.public-key");

class Maps extends Component {
  componentDidMount() {
    MapboxGL.setTelemetryEnabled(false);
  }

  render() {
    return (
      <View style={styles.page}>
        <View style={styles.container}>
          <MapboxGL.MapView 
            style={styles.map} 
            animated={false}
            compassEnabled
            showsMyLocationButton
          >
            <MapboxGL.Camera
              animated={false}
              compassEnabled={true}
              followUserLocation
              followUserMode='normal'
              zoomLevel={16}
              followZoomLevel={16}
              animationDuration={10}
            />
            <MapboxGL.MarkerView coordinate={[139.773, 35.6986]} />
            <MapboxGL.UserLocation showsUserHeadingIndicator={true}>
            </MapboxGL.UserLocation>
          </MapboxGL.MapView>
        </View>
      </View>
    );
  }
}

毕竟,感谢您对@JimXu的帮助。我真的很感激。