2015-03-17 3 views
0

Я пытаюсь загрузить обычный текстовый файл на классическую страницу asp и получить сообщение об ошибке.Vba Загрузить текстовый файл

<p>Microsoft VBScript runtime </font> <font face="Arial" size=2>error '800a01a8'</font> 
<p> 
<font face="Arial" size=2>Object required: 'fields(...)'</font> 

HTML код

<form action="upload.asp" method=post ENCTYPE="multipart/form-data"> 
     File : 
<input type="file" class="form_field" name="File1" accept="image/jpeg"> 
<input type="submit" class="form_pb" Name="Action" value="Send File"> 
</form> 

Vba код, чтобы установить пост переменной и отправить запрос.

Const STR_BOUNDARY As String = "a832972453175" 
    Dim nFile   As Integer 
    Dim baBuffer()  As Byte 
    Dim sPostData  As String 
.... 

'--- read file 
nFile = FreeFile 
Open sFileName For Binary Access Read As nFile 
    If LOF(nFile) > 0 Then 
     ReDim baBuffer(0 To LOF(nFile) - 1) As Byte 
     Get nFile, , baBuffer 
     sPostData = StrConv(baBuffer, vbUnicode) 
    End If 
Close nFile 

sPostData = "--" & STR_BOUNDARY & vbCrLf & _ 
     "Content-Disposition: form-data; name=""File1""; filename=""" & Mid$(sFileName, InStrRev(sFileName, "\") + 1) & """" & vbCrLf & _ 
      "Content-Type: text/plain" & vbCrLf & vbCrLf & _ 
      sPostData & vbCrLf & vbCrLf & _ 
      STR_BOUNDARY & vbCrLf & _ 
      "Content-Disposition: form-data; name=""Action""" & vbCrLf & _ 
      vbCrLf & "Send File" & vbCrLf & _ 
      "--" & STR_BOUNDARY & "--" 

With WinHttpReq 

'UPLOAD REQUEST 
.Open "POST", sUrl, False 
.setRequestHeader "Content-Type", "multipart/form-data; boundary=" & STR_BOUNDARY 
.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" 
.Send (sPostData) 
end with 

У меня есть доступ к исходному коду страницы, которая является классической страницей осины и загрузка выполняется с VBScript работает на сервере.

Ошибка в том, что аргумент File1 = "", а затем загрузка не запускается.

Несмотря на то, что атрибут accept в html-коде предназначен только для «image/jpeg», я могу нормально загрузить при навигации с помощью браузера.

Я считаю, что что-то не так с моей переменной sPostData в коде Vba.

Файл с функции загрузки здесь: https://www.royalholloway.ac.uk/resources/ASP/PStruh-CZ/1.3/upload.inc

Любой человек может увидеть, что я делаю неправильно?

+0

ошибки в 'Требуется объект:«поля (...) '' предоставленный код не показывает упоминание коллекции 'fields', поэтому я предлагаю вам искать не то место. Не была ли ошибка содержать имя страницы и номер строки? – Lankymart

+0

Ошибка вызвана тем, что результат функции GetUpload в файле upload.inc пуст. Как я уже опубликовал, есть условие, чтобы начать загрузку (если поля («Файл1»). FileName = «« ничего не запускать загрузку » – luckasx

+0

Я не думаю, что это когда-нибудь будет работать, что представляет собой двоичную многочастную информацию в виде строки. Сообщение о многостраничной форме обрабатывает всю информацию о границах, которую вы не можете передать, прежде чем она будет обработана, вы просто закончите с неверным преобразованием. Попробуйте просмотреть запрос с помощью [Fiddler] (http://www.telerik.com/fiddler), чтобы посмотреть, как выглядит запрос RAW. – Lankymart

ответ

0

Я создал копию страницы загрузки и искал что-то неправильно. Я узнал, что граница, переименованная на странице, была "myboundary" + ;Charset=UTF-8.

Решение в этом случае добавляет кодировку в заголовок запроса.

With WinHttpReq 

'UPLOAD REQUEST 
.Open "POST", sUrl, False 
.setRequestHeader "Content-Type", "multipart/form-data; Charset=UTF-8;boundary=" & STR_BOUNDARY 
.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" 
.Send (sPostData) 
end with 

.setRequestHeader "Content-Type", "многочастному/форм-данных; Charset = UTF-8; граница =" & STR_BOUNDARY

0

Сегодня я обнаружил, что я могу загрузить файлы (либо текст или бинарный) из VBA Excel (может быть Word, MSAccess или Outlook тоже) через стандартный POST (по крайней мере, он работает для небольших файлов). Во-первых, он открывает файл в массиве байтов. Во-вторых, он преобразует массив байтов в строку Base64. В-третьих, он использует объект IE для заполнения формы и отправки ее без прямого взаимодействия с пользователем.

Public Function UploadFileTo(sourceFile As String, uURL As String, nameFieldID As String, dataFieldID As String, formID As String) As Boolean 
    UploadFileTo = False 
    ''--------------------------- 
    Dim nome As String, dados64 
    Dim bs() As Byte 
    nome = Dir(sourceFile) 
    If (nome = "") Then Exit Function 
    '' 
    bs = ReadFile2("" & sourceFile) ' loads the file into a byte array 
    dados64 = Base64Encode(bs) ' encodes it to base64 and returns as String 
    '' 
    Dim ie As InternetExplorerMedium 
    'Dim ie 'As Object 
    Dim docweb As Object 
    Set ie = New InternetExplorerMedium 
    'Set ie = CreateObject("InternetExplorerMedium") 
    'Set ie = GetObject("new:{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}") 
    ie.Navigate2 uURL 
    ie.Visible = True 
    While ie.Busy: DoEvents: Wend 
    While ie.ReadyState <> 4: DoEvents: Wend 
    '' 
    Set docweb = ie.Document 
    docweb.all(nameFieldID).Value = nome 
    docweb.all(dataFieldID).Value = dados64 
    docweb.all(formID).Submit 
    While ie.Busy: DoEvents: Wend 
    While ie.ReadyState <> READYSTATE_COMPLETE: DoEvents: Wend 
    '' 
    ie.Quit 
    ''--------------------------- 
    UploadFileTo = True 
End Function 

Например: для вызова на следующей странице:

if UploadFileTo("C:\myPath\myFile.txt", "http://www.website.com/page.html", "myFileNameField", "myFileData", "myDistantForm") then 
    MsgBox "File Uploaded successfully" 
else 
    MsgBox "Failed." 
end if 

Он называет URL-адрес http://www.website.com/page.html

<html> 
<head> 
    <title>Sending files within POST with base64 encoding</title> 
</head> 
<body> 
    <form id="myDistantForm" action="teste.cgi" method="POST"> 
    Name: <input type="text" id="finame" name="arq_nome" value=""> <br> 
    Data: <textarea name="myFileNameField" id="fidata" rows="30" cols="120"></textarea> <br> 
    <input type="submit" name="myFileData" value="Send the File"> <br> 
    </form> 
</body> 
</html> 

ВАЖНО: Сервер должен быть способен декодировать Base64-кодированные строки и , затем сохраните декодированные данные в файл в каталоге желаемого сервера, используя данное имя (или некоторое автогенерированное уникальное имя), независимо от того, запускает ли целевой сервер ASP, PHP, JSP, CGI/ISAPI или без разницы.

Чтобы прочитать любой файл в массив байт: how can I read a binary file using VBA?

Чтобы закодировать этот массив в Base64 строку: How do I base64 encode a string efficiently using Excel VBA? точки

+0

Ну ... чтобы адаптировать его для использования в классическом ASP, вы можете следить за моим ответом, адаптируя его, удалив все, что связано с Excel. Или просто воспользуйтесь его сущностью: сначала загрузите файл в массив байтов, затем преобразуйте эти данные в строку Base64, а затем отправьте эту строку на целевую страницу (в качестве общего запроса FORM, а не как в форме загрузки). Сервер должен иметь возможность декодировать base64 String и сохранять его в файле с тем же именем и расширением. По крайней мере, он был протестирован с небольшими файлами, включая видео. Текстовые файлы также работают очень хорошо. –