批量上传到Azure中的blob

时间:2012-03-07 18:51:48

标签: .net azure

我有大约10k的图像,我需要将它们上传到blob存储。有没有批量上传的工具?我也愿意编写自己的应用程序。

5 个答案:

答案 0 :(得分:2)

看看ClumsyLeaf cloud explorer。让我们像FTP客户端一样将文件上传到blob。 Alterntaively Azure Storage Explorer。同样的想法。

两者都允许您从目录中选择文件并一次上传。从来没有尝试10000,但它应该工作。

答案 1 :(得分:1)

Cloud Storage Studio也很不错。

http://cerebrata.com/Products/CloudStorageStudio/

您可以免费获得30次试用,因此没有风险。特别是如果这是一次性交易。

答案 2 :(得分:1)

您可以使用windows azure powershell从azure存储上传/下载多个文件。

要上传多个文件,可以使用以下命令行。

ls -File -Recurse | Set-AzureStorageBlobContent -Container upload

要下载多个blob,可以使用以下命令行。

Get-AzureStorageBlob -Container containername -Blob blobname | Get-AzureStorageBlobContent

有关详细信息,请参阅MSDN页面。

http://msdn.microsoft.com/en-us/library/dn408487.aspx

http://msdn.microsoft.com/en-us/library/dn408562.aspx

答案 3 :(得分:1)

我发现由于使用少量线程,现有工具要么是付费软件要么是缓慢的。 TBH甚至我尝试过的付费应用程序都很慢,但Azure API非常简单,所以我最终编写了自己的命令行工具,它叫做azupload:

https://github.com/bviktor/azupload

它是免费的,根据MIT许可证发布。它有C#和Java版本,因此您可以在Windows和Linux上轻松部署它。

C#版本使用内部.NET调度程序来启动新线程(我的comp通常是10-ish),而Java版本启动的线程数与指定的数量相同。这是非常高效的,我用700张图片(总共20MiB)和100个线程测试了它,它在8秒内完成了上传。

当然,你必须找到一个平衡点。如果启动太多线程,最终会因Java VM的开销而减慢速度。此外,如果你上传大文件,上传100个线程没有意义,因为在这种情况下,瓶颈将是带宽,而不是像许多小文件那样的事务开销。此外,如果您上传许多文件,JVM将以比关闭它们更快的速度打开文件,所以一段时间后您将获得Too many open files个例外(对于我来说,13k文件发生在我身上@ 100)线程)。因此,根据经验,文件越小,线程越多,但你应该停在50左右。

非常感谢您的反馈!

答案 4 :(得分:0)

1.选择明确:

========用于选择粘贴格式的枚举===== Enum eFormat

Picture = 1    Chart = 2    Table = 3
End Enum

=============================================== ========================

       Sub pGeneratePPT_Click()
       Dim lngWksCount         As Long    Dim lngLoopFirst        As Long    Dim lngLoopSecond       As Long    Dim lngSlide           
As Long    Dim objTemplate         As Object
       If MsgBox("Please click OK to generate the slide or click CANCEL to exit from the existing process.", vbOKCancel, "WARNING!")
=    vbCancel Then
       MsgBox "You have selected CANCEL please click the 'PPT converter' button again to convert into power point.",
vbInformation,    "Generation of slide presentation has been
cancelled."
       GoTo lblExit    End If
       lngWksCount = ThisWorkbook.Worksheets.Count    Set objTemplate = Wks_INDEX.OLEObjects("objPPTTemplate")
       For lngLoopFirst = 1 To lngWksCount
       With ThisWorkbook.Worksheets(lngLoopFirst)
           For lngLoopSecond = 1 To .ChartObjects.Count
               If .ChartObjects(lngLoopSecond).Visible = True Then
                   lngSlide = lngSlide + 1
                   Call fPPTGenerator(objTemplate, .Name, lngSlide, Chart, .ChartObjects(lngLoopSecond).Name)
               End If
           Next lngLoopSecond
       End With    Next lngLoopFirst
       MsgBox "Done!", vbInformation
    lblExit:    lngWksCount = Empty    lngLoopFirst = Empty    lngLoopSecond = Empty    lngSlide = Empty    Set objTemplate =
Nothing
       End Sub


       Function fPPTGenerator(objOLEObject As Object, strSheetName As    String, lngSlide As Long, enumPasteAs As eFormat, _
                   strRangeOrChartName As String, Optional dblLeftInInches As Double, Optional dblTopInInches As Double, _
                   Optional dblHeightInInches As Double, Optional dblWidthInInches As Double)
       Dim lngLoopFirst            As Long    Dim lngLoopSecond           As Long    Dim objSlide                As Object 'PowerPoint.Slide  
Dim objTemplate             As Object 'Embbed File for template   
Dim objLayout               As Object    Dim objMainObject          
As Object    Dim varPicture              As Variant    Dim lngStatus
As Long    Dim objShape                As Object    Dim
strPathTemplate         As String    Dim objFileSystem           As
Object    Dim objFile                 As Object    Dim strFileName  
As String    Dim objPresTemp             As Object    Dim blnOpen   
As Boolean    Dim objPPT                  As Object    Dim objPres  
As Object    Dim blnNoError              As Boolean    Dim
blnTemplateNotFound     As Boolean
       lngStatus = Application.ScreenUpdating    Application.ScreenUpdating = False

           On Error GoTo lblNewPPT '****If the presentation is already open or not****    Set objPPT = GetObject(,
"Powerpoint.Application")    Set objPres = objPPT.presentations(1)  
blnOpen = True '**************************************************
       lblNewPPT: '****If the presentation is not opened already****    If blnOpen = False Then    On Error GoTo 0: On Error GoTo -1:
Err.Clear
       Set objPPT = CreateObject("Powerpoint.Application")
       Set objPres = objPPT.presentations.Add    End If '**************************************************    Set
objFileSystem = CreateObject("Scripting.FileSystemObject")
    '**********Setting or adding the slides***********    If objPres.slides.Count <> lngSlide Then
       Set objLayout = objPres.Designs(1).SlideMaster.CustomLayouts(1)
       Set objSlide = objPres.slides.Addslide(lngSlide, objLayout)    Else
       Set objSlide = objPres.slides(lngSlide)    End If '**************************************************
       '*******Opening the embbed file in the editing mode*********    objOLEObject.Verb Verb:=xlEditBox    objPPT.WindowState = 2
'**************************************************
       '*****Open the presentation and saving it at the workbook path*****    Set objPresTemp = objPPT.activepresentation   
objPresTemp.SaveAs ThisWorkbook.Path & "\Template.pot"   
objPresTemp.Close
'**************************************************   
objPPT.WindowState = 2    For Each objFile In
objFileSystem.getfolder(ThisWorkbook.Path).Files
       If Right(objFile.Name, 3) = "pot" Then
           strFileName = objFile.Name
           blnTemplateNotFound = False
           Exit For
       Else
           blnTemplateNotFound = True
       End If    Next
       If blnTemplateNotFound = False Then
       objPres.ApplyTemplate FileName:=ThisWorkbook.Path & "\Template.pot"     'Applying the Template to the new presentation  
Else
       MsgBox "Please embed the template in the" & vbNewLine & "'Microsoft Powerpoint 93-2003 Template' (*.pot) Format!",
vbCritical
       blnNoError = False
       GoTo lblExit:    End If
       Kill ThisWorkbook.Path & "\" & strFileName                              'Deleting the template thereafter applying
       For lngLoopFirst = 1 To objSlide.Shapes.Count                           'Removing the extra shapes on the new slide
       objSlide.Shapes(lngLoopFirst).Delete
       If objSlide.Shapes.Count > 0 Then
           lngLoopFirst = lngLoopFirst - 1
       Else
           Exit For
       End If    Next
       objPPT.Visible = True    Select Case enumPasteAs

       Case Picture:
           On Error GoTo lblErrorPic
           Set objMainObject = ThisWorkbook.Worksheets(strSheetName).Shapes(strRangeOrChartName)

           objMainObject.CopyPicture Format:=xlPicture
           Set varPicture = objSlide.Shapes.PasteSpecial(2)
           varPicture.LockAspectRatio = False
           blnNoError = True lblErrorPic:
           If blnNoError = False Then
               MsgBox "Shape object not Found!" & vbNewLine & vbNewLine & "Worksheet: " & strSheetName & _
               vbNewLine & "Shape:         " & strRangeOrChartName, vbCritical
               On Error GoTo 0: On Error GoTo -1: Err.Clear
               GoTo lblExit
           End If

       Case Chart:
           On Error GoTo lblErrorChart
           Set objMainObject = ThisWorkbook.Worksheets(strSheetName).Shapes(strRangeOrChartName)

           objMainObject.Copy
           objPPT.Activate
           objSlide.Select
           objPPT.ActiveWindow.View.Paste
           Set varPicture = objSlide.Shapes(1)
           blnNoError = True
            lblErrorChart:
           If blnNoError = False Then
               MsgBox "Chart not Found!" & vbNewLine & vbNewLine & "Worksheet: " & strSheetName & vbNewLine _
               & "Chart:          " & strRangeOrChartName, vbCritical
               On Error GoTo 0: On Error GoTo -1: Err.Clear
               GoTo lblExit
           End If

       Case Table:
           On Error GoTo lblError
           Set objMainObject = ThisWorkbook.Worksheets(strSheetName).Range(strRangeOrChartName)
           objMainObject.Copy
           objPPT.Activate
           objSlide.Select
           objPPT.ActiveWindow.View.Paste
           For Each objShape In objSlide.Shapes
               If Ucase(Left(objShape.Name, 5)) = "TABLE" Then
                   Set varPicture = objSlide.Shapes(objShape.Name)
                   Exit For
               End If
           Next
           blnNoError = True lblError:
           If blnNoError = False Then
               MsgBox "Range Not Found!" & vbNewLine & vbNewLine & "Range:          " & strRangeOrChartName & _
               vbNewLine & "Worksheet:  " & strSheetName, vbCritical
               On Error GoTo 0: On Error GoTo -1: Err.Clear
               GoTo lblExit
           End If    End Select
       With varPicture
       If dblLeftInInches <> 0 Then
           .Left = dblLeftInInches * 72
       Else
           .Left = 33
       End If

       If dblTopInInches <> 0 Then
           .Top = dblTopInInches * 72
       Else
           .Top = 118
       End If

       If dblHeightInInches <> 0 Then
           .Height = dblHeightInInches * 72
       Else
           .Height = 360
       End If

       If dblWidthInInches <> 0 Then
           .Width = dblWidthInInches * 72
       Else
           .Width = 655
       End If    End With
       objPPT.ActiveWindow.View.Zoom = 100
    '    objPres.SaveAs ThisWorkbook.Path & "\PPT_" & Format(Now(), "dd_mmm_yyyy") & ".pptx"
    lblExit:    objPPT.WindowState = 2
       lngLoopFirst = Empty    lngLoopSecond = Empty    Set objSlide = Nothing    Set objTemplate = Nothing    Set objLayout = Nothing    Set objMainObject = Nothing    Set varPicture = Nothing    Set
objShape = Nothing    strPathTemplate = Empty    Set objFileSystem =
Nothing    Set objFile = Nothing    strFileName = Empty    Set
objPresTemp = Nothing    blnOpen = Empty    Set objPres = Nothing
       Application.ScreenUpdating = lngStatus    lngStatus = Empty
       If blnNoError = False Then
       objPPT.Quit
       End    End If

    End Function
       ======================================
       Option Explicit Option Compare Text
       Private adoConn              As Object Private adoRset                 As Object
       Private Const mc_strModuleName      As String =    "modExportExcelDataToAccess" Private Const strMsgBoxTitle        As 
String = "Uploader" Private Const strDbName             As String = 
"Test.mdb"
       Sub test()
       Call ExportDataIntoAccess( _
                               db_FullPath:=ThisWorkbook.Path & Application.PathSeparator & strDbName, _
                               db_tblName:="Test" & CLng(Timer), _
                               xl_FileFullPath:=ThisWorkbook.FullName, _
                               xl_SheetName:="Sheet1", _
                               xl_DataRange:="$A$1:$E$200000", _
                               xl_HeaderYes:=True, _
                               blnDelTableExistingData:=True)
    End Sub
       Sub ExportDataIntoAccess( _
                           ByVal db_FullPath As String, _
                           ByVal db_tblName As String, _
                           ByVal xl_FileFullPath As String, _
                           ByVal xl_SheetName As String, _
                           ByVal xl_DataRange As String, _
                           ByVal xl_HeaderYes As Boolean, _
                           Optional blnDelTableExistingData As Boolean = False)


       Dim wbkWorkBook         As Workbook    Dim wksWorkSheet        As Worksheet    Dim varData             As Variant    Dim lngLoopD  
As Long    Dim lngLoopA            As Long    Dim lngLoop           
As Long    Dim lngFldsCount        As Long    Dim lngLastCol        
As Long    Dim lngLastRow          As Long    Dim strSQL            
As String    Dim strTemp             As String    Dim lngCounter    
As Long    Dim dblSum              As Double    Dim dbFlds()        
As String    Dim dataFlds            As Variant    Dim varFound     
As Variant    Dim rngFirstCell        As Range    Dim rngData       
As Range    Dim strAddress          As String    Dim lngScreenUp    
As Long    Dim lngCalc             As Long    Dim dtTime            
As Date
          dtTime = Time
           Const DataTypeNumeric   As String = "Single"    Const DataTypeString    As String = "varchar(255)"    Const
DataTypeDateTime  As String = "DateTime"

       'Setting Table Name    If Left(db_tblName, 1) <> "[" Then
       db_tblName = "[" & db_tblName    End If    If Right(db_tblName, 1) <> "]" Then
       db_tblName = db_tblName & "]"    End If
           'Checking file path is correct.    If Not IsFileExists(xl_FileFullPath) Then Exit Sub
       'Disabling Application Level Events    With Application
       .EnableEvents = 0
       lngCalc = .Calculation
       lngScreenUp = .ScreenUpdating
       '.ScreenUpdating = 0
       .DisplayAlerts = 0
       .Calculation = xlCalculationManual    End With
       'Checking if given file and sheet is available or not    On Error Resume Next    If Not IsFileOpen(xl_FileFullPath) Then
       Set wbkWorkBook = Workbooks.Open(xl_FileFullPath)    ElseIf LCase(ThisWorkbook.FullName) = LCase(xl_FileFullPath) Then
       Set wbkWorkBook = ThisWorkbook    Else
       If IsFileOpen(xl_FileFullPath) Then
           MsgBox "File is already open. Please save file and close it first to upload data.", vbCritical, strMsgBoxTitle
           GoTo QuickExit
       Else
           Set wbkWorkBook = Workbooks.Open(xl_FileFullPath)
       End If    End If    Set wksWorkSheet = wbkWorkBook.Worksheets(CStr(xl_SheetName))
       'Error handling    If Err.Number <> 0 Then
       MsgBox "Worksheet '" & xl_SheetName & " doesn't exists", vbInformation
       Err.Clear: On Error GoTo 0
       GoTo QuickExit    End If
       Call OpenDB(db_FullPath)    With wksWorkSheet

       'Data Range
       Set rngData = .Range(xl_DataRange)

       'checking for header if available
       If xl_HeaderYes Then
           dataFlds = Application.Transpose(Application.Transpose(rngData.Resize(1)))
       Else
           adoRset.Open "Select * From " & db_tblName & " Where 1=2", adoConn, 3, 3

           ReDim datafld(1 To adoRset.Fields.Count)
           For lngLoop = 0 To adoRset.Fields.Count - 1
               Select Case adoRset.Fields(lngLoop).Type
                   Case 202 'adVarWChar
                       datafld(lngLoop + 1) = 202 'advarWChar
                   Case 4 'adSingle
                       datafld(lngLoop + 1) = 4 'adSingle
                   Case 5 'adDouble
                       datafld(lngLoop + 1) = 5 'adDouble
                   Case 7 'adDate
                       datafld(lngLoop + 1) = 7 'adDate
               End Select
           Next lngLoop
       End If
       varData = rngData    End With    If LCase(wbkWorkBook.FullName) <> LCase(xl_FileFullPath) Then
wbkWorkBook.Close (0)
       On Error GoTo 0    'Checking if table is already exist  or not.    If Not blnTableExistsInDB(CStr(db_tblName)) Then
       'Creating table
       If xl_HeaderYes Then
           If IsArray(varData) And IsArray(dataFlds) Then
               strTemp = "Create Table " & CStr(db_tblName) & vbLf & "("
               ReDim datafld(1 To UBound(dataFlds, 1))
               For lngLoopD = 1 To UBound(dataFlds, 1)
                   If IsNumeric(varData(2, lngLoopD)) And Len(varData(2, lngLoopD)) Then
                       strTemp = strTemp & vbLf & IIf(lngLoopD = 1, "[" & dataFlds(lngLoopD) & "]", ",[" & dataFlds(lngLoopD) & "]") & "
" & DataTypeNumeric
                       datafld(lngLoopD) = 5 'adDouble
                   ElseIf IsDate(varData(2, lngLoopD)) Then
                       strTemp = strTemp & vbLf & IIf(lngLoopD = 1, "[" & dataFlds(lngLoopD) & "]", ",[" & dataFlds(lngLoopD) & "]") & "
" & DataTypeDateTime
                       datafld(lngLoopD) = 7 'adDate
                   Else
                       strTemp = strTemp & vbLf & IIf(lngLoopD = 1, "[" & dataFlds(lngLoopD) & "]", ",[" & dataFlds(lngLoopD) & "]") & "
" & DataTypeString
                       datafld(lngLoopD) = 202 'advarWChar
                   End If
               Next lngLoopD
               strTemp = strTemp & vbLf & ")"
               adoConn.Execute Replace(strTemp, "''", "Null")
           End If
       Else
           If IsArray(varData) Then
               strTemp = "Create Table " & CStr(db_tblName) & vbLf & "("
               For lngLoopD = 1 To UBound(varData, 2)
                   If IsNumeric(varData(2, lngLoopD)) And Len(varData(2, lngLoopD)) Then
                       strTemp = strTemp & vbLf & IIf(lngLoopD = 1, "[Field" & lngLoopD & "]", ",[Field" & lngLoopD & "]") & " " &   
DataTypeNumeric
                   ElseIf IsDate(varData(2, lngLoopD)) Then
                       strTemp = strTemp & vbLf & IIf(lngLoopD = 1, "[Field" & lngLoopD & "]", ",[Field" & lngLoopD & "]") & " " &   
DataTypeNumeric
                   Else
                       strTemp = strTemp & vbLf & IIf(lngLoopD = 1, "[Field" & lngLoopD & "]", ",[Field" & lngLoopD & "]") & " " &   
DataTypeString
                   End If
               Next lngLoopD
               strTemp = strTemp & vbLf & ")"
               adoConn.Execute Replace(strTemp, "''", "Null")
           End If
       End If    Else
       'Delete existing data from the table.
       If blnDelTableExistingData Then
           strSQL = "Delete * FROM " & CStr(db_tblName)
           adoConn.Execute strSQL
       End If    End If
       'Inserting data into the table row by row.    On Error GoTo EarlyExit    If IsArray(varData) Then
       For lngLoopD = LBound(varData) + 1 To UBound(varData, 1)
           strTemp = "INSERT INTO " & CStr(db_tblName) & " VALUES ("
           For lngLoopA = 1 To UBound(datafld)

               If datafld(lngLoopA) = 5 Or datafld(lngLoopA) = 4 Then 'adDouble 'adSigle
                   If Not IsEmpty(varData(lngLoopD, lngLoopA)) Then
                       strTemp = strTemp & vbLf & IIf(lngLoopA = 1, varData(lngLoopD, lngLoopA), "," & varData(lngLoopD, lngLoopA))
                   ElseIf IsEmpty(varData(lngLoopD, lngLoopA)) Then
                       strTemp = strTemp & vbLf & IIf(lngLoopA = 1, "NULL", ",NULL")
                   End If
               ElseIf datafld(lngLoopA) = 7 Then 'adDate
                   varData(lngLoopD, lngLoopA) = Replace(varData(lngLoopD, lngLoopA), "#", "")
                   varData(lngLoopD, lngLoopA) = Evaluate("=VALUE(""" & varData(lngLoopD, lngLoopA) & """)")
                   strTemp = strTemp & vbLf & IIf(lngLoopA = 1, varData(lngLoopD, lngLoopA), "," & varData(lngLoopD, lngLoopA))
               ElseIf datafld(lngLoopA) = 202 Then 'advarWChar
                   varData(lngLoopD, lngLoopA) = Replace(varData(lngLoopD, lngLoopA), "'", "''")
                   varData(lngLoopD, lngLoopA) = Replace(varData(lngLoopD, lngLoopA), """", """""")
                   strTemp = strTemp & vbLf & IIf(lngLoopA = 1, "'" & varData(lngLoopD, lngLoopA) & "'", ",'" & varData(lngLoopD,   
lngLoopA) & "'")
               End If

               'Debug.Print strTemp
           Next lngLoopA
           strTemp = strTemp & ")"
           'Debug.Print "ROW: " & lngLoopD '  & ":" & strTemp
           Call StatusBar(lngLoopD & " Out Of " & UBound(varData) - 1 & " Records inserted into " & db_tblName & " ...")
           adoConn.Execute Replace(strTemp, "''", "Null")
       Next lngLoopD
       Call StatusBar(lngLoopD & "Records are inserted successfully." & vbLf & "Process Started at " & dtTime & " and   
Finished at " & Time)
       MsgBox lngLoopD & "Records are inserted successfully." & vbLf & "Process Started at " & dtTime & " and Finished at " & Time,   
vbInformation, strMsgBoxTitle
       Call StatusBar(, False)    End If
    EarlyExit:    If Err.Number <> 0 Then
       MsgBox "Error #:" & Err.Number & vbLf & Err.Description
       Err.Clear: On Error GoTo 0
       Stop    Else
       Call StatusBar("", False)    End If    Erase varData    dblSum = Empty    dataFlds = Empty QuickExit:    With Application
       .EnableEvents = 1
       .ScreenUpdating = lngScreenUp
       .DisplayAlerts = 1
       .Calculation = lngCalc    End With
       Call CloseDB
       End Sub
       Private Function IsFileExists(ByVal FullFileName As String) As    Boolean    IsFileExists = False    On Error Resume Next   
IsFileExists = CBool(Len(Dir(FullFileName))) End Function
       Private Sub OpenDB(ByVal strDBPath As String)
       Set adoConn = CreateObject("ADODB.Connection")    Set adoRset = CreateObject("ADODB.Recordset")    adoConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;data source=" & CStr(strDBPath) &
";"
    End Sub Private Sub CloseDB()
       On Error Resume Next    If adoRset.State <> 0 Then adoRset.Close    If adoConn.State <> 0 Then adoConn.Close    On
Error GoTo 0: Err.Clear
    End Sub

       Private Function blnTableExistsInDB(strTableName As String) As    Boolean
       Dim rst         As Object    Dim strTbl      As String
       strTbl = strTableName
       Set rst = adoConn.OpenSchema(20) 'adSchemaTables
       If Left(strTbl, 1) = "[" And Right(strTbl, 1) = "]" Then
       strTbl = Mid(strTbl, 2, Len(strTbl) - 2)    End If
       rst.Filter = "TABLE_TYPE='TABLE' and TABLE_NAME='" & strTbl & "'"    On Error Resume Next    blnTableExistsInDB =
(Ucase(rst.Fields("TABLE_NAME").Value) = Ucase(strTbl))    On Error
GoTo 0    If Err.Number <> 0 Then blnTableExistsInDB = False    Set
rst = Nothing
    End Function
       Private Function IsFileOpen(ByVal FileName As String)
       Dim iFilenum As Long    Dim iErr As Long
        On Error Resume Next    iFilenum = FreeFile()    Open FileName For Input Lock Read As #iFilenum    Close iFilenum    iErr
= Err    On Error GoTo 0
        Select Case iErr    Case 0:    IsFileOpen = False    Case 70:   IsFileOpen = True    Case Else: Error iErr    End Select
     End Function
       Private Sub StatusBar(Optional strMsg As String = vbNullString,    Optional blnShow As Boolean = True)
       DoEvents    If Not blnShow Then Application.StatusBar = blnShow: Exit Sub    Application.StatusBar = strMsg
    End Sub