I'm trying to upload an image file to a PHP file on a web server.
On VB.NET ->
My.Computer.Network.UploadFile(tempImageLocation, "website.com/upload.php")
tempImageLocation is a location on the harddrive where the image is located. The image is located on the harddrive where I specify it.
On PHP ->
$image = $_FILES['uploads']['name'];
I don't understand, because it is loading the page - but PHP can't find the file under 'uploads'
Google brought me here while I was searching for the same question. Thanks people it gave me the idea, and with a little knowledge of PHP, I've achieved it. I know its an old question but still I'm going to share my code so it could help people in future..
VB:
My.Computer.Network.UploadFile("e:\file1.jpg", "http://www.mysite.com/upl/upl.php")
PHP:
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
and don't forget to give the upload folder the appropriate permissions.
I know, is old.. but here is solution work to me:
Private Sub HttpUploadFile(
ByVal uri As String,
ByVal filePath As String,
ByVal fileParameterName As String,
ByVal contentType As String)
Dim myFile As New FileInfo(filePath)
Dim sizeInBytes As Long = myFile.Length
Dim boundary As String = "---------------------------" & DateTime.Now.Ticks.ToString("x")
Dim newLine As String = System.Environment.NewLine
Dim boundaryBytes As Byte() = Encoding.ASCII.GetBytes(newLine & "--" & boundary & newLine)
Dim request As Net.HttpWebRequest = Net.WebRequest.Create(uri)
request.ContentType = "multipart/form-data; boundary=" & boundary
request.Method = "POST"
request.KeepAlive = True
'request.Credentials = Net.CredentialCache.DefaultCredentials
Using requestStream As IO.Stream = request.GetRequestStream()
Dim formDataTemplate As String = "Content-Disposition: form-data; name=""{0}""{1}{1}{2}"
requestStream.Write(boundaryBytes, 0, boundaryBytes.Length)
Dim headerTemplate As String = "Content-Disposition: form-data; name=""{0}""; filename=""{1}""{2}Content-Type: {3};"
Dim header As String = String.Format(headerTemplate, fileParameterName, filePath, newLine, contentType)
header = header & vbNewLine & "Content-Length: " & sizeInBytes.ToString & vbNewLine
header = header & "Expect: 100-continue" & vbNewLine & vbNewLine
'MsgBox(header)
Debug.Print(header)
Dim headerBytes As Byte() = Encoding.UTF8.GetBytes(header)
requestStream.Write(headerBytes, 0, header.Length)
Using fileStream As New IO.FileStream(filePath, IO.FileMode.Open, IO.FileAccess.Read)
Dim buffer(4096) As Byte
Dim bytesRead As Int32 = fileStream.Read(buffer, 0, buffer.Length)
Do While (bytesRead > 0)
requestStream.Write(buffer, 0, bytesRead)
bytesRead = fileStream.Read(buffer, 0, buffer.Length)
Loop
End Using
Dim trailer As Byte() = Encoding.ASCII.GetBytes(newLine & "--" + boundary + "--" & newLine)
requestStream.Write(trailer, 0, trailer.Length)
requestStream.Close()
End Using
Dim response As Net.WebResponse = Nothing
Try
response = request.GetResponse()
Using responseStream As IO.Stream = response.GetResponseStream()
Using responseReader As New IO.StreamReader(responseStream)
Dim responseText = responseReader.ReadToEnd()
Debug.Print(responseText)
End Using
End Using
Catch exception As Net.WebException
response = exception.Response
If (response IsNot Nothing) Then
Using reader As New IO.StreamReader(response.GetResponseStream())
Dim responseText = reader.ReadToEnd()
Diagnostics.Debug.Write(responseText)
End Using
response.Close()
End If
Finally
request = Nothing
End Try
End Sub
Using:
HttpUploadFile("https://www.yousite.com/ws/upload.php?option1=sss&options2=12121", FULL_FILE_NAME_PATH_IN_YOUR_PC, "files", "multipart/form-data")
I copy somen code in a website i dont remember.
I only put this 2 lines of code to work:
header = header & vbNewLine & "Content-Length: " & sizeInBytes.ToString & vbNewLine
header = header & vbNewLine & "Expect: 100-continue" & vbNewLine
hope help.
Here is the complete example for uploading file using Visual Basic and on Server Side PHP (Rest API) GitHub Link
Here is quick and dirty tutorial for you: PHP File Upload
'uploads' is just name attribute value of element of a form:
<input type="file" name="uploads" />
or in other words, this is POST variable name that is accessed over $_FILES global.
If you don't set the field name, you can save the uploaded file with this
$file = array_shift($_FILES);
move_uploaded_file($file['tmp_name'], '/path/to/new/location/'.$file['name']);
Take a look at some of these other answers. PHP requires files uploaded with the POST method to use certain headers which are normally set by the browser when uploading from a web form but which can be set in VB with the HttpWebRequest Class.
As for the PHP side, you aren't going to be able to locate the file immediately after uploading with $image = $_FILES['uploads']['name'];. PHP stores uploads with a temporary filename accessible with the $_FILES['uploads']['tmp_name'] variable, and using move_uploaded_file() is the standard way of shifting uploads from temporary storage into a permanent uploads directory. The PHP manual provides a good overview of that.
Here's my sample server php file:
<?php
// write to a log file so you know it's working
$msg = $_POST['w'];
$logfile= 'data.txt';
$fp = fopen($logfile, "a");
fwrite($fp, $msg);
fclose($fp);
$file = array_shift($_FILES);
move_uploaded_file($file['tmp_name'], '/MAMP/htdocs/test/'.$file['name']);
?>
Here's the code to call #Rodrigo's code:
HttpUploadFile("http://localhost/test/test.php?w=hello&options2=12121", "C:\temp\bahamas.mp3", "files", "multipart/form-data")
Related
I have a download server for files.
And I want my users to get the files from the download server.
My download server is Linux.
I want when the user clicks on the download button.
Get the file directly from the download server.
I do not want to use the stream to download ...
I want to connect to the download server via the link and then download it using PHP
My site is with mvc
Thank you, step by step to help me
thank you
Stream stream = null;
//This controls how many bytes to read at a time and send to the client
int bytesToRead = 10000;
// Buffer to read bytes in chunk size specified above
byte[] buffer = new Byte[bytesToRead];
// The number of bytes read
try
{
//Create a WebRequest to get the file
HttpWebRequest fileReq = (HttpWebRequest)HttpWebRequest.Create(Global.UrlVideoPrice + IdCourse + "//" + IdTopic+".rar");
//Create a response for this request
HttpWebResponse fileResp = (HttpWebResponse)fileReq.GetResponse();
if (fileReq.ContentLength > 0)
fileResp.ContentLength = fileReq.ContentLength;
//Get the Stream returned from the response
stream = fileResp.GetResponseStream();
// prepare the response to the client. resp is the client Response
var resp = System.Web.HttpContext.Current.Response;
//Indicate the type of data being sent
resp.ContentType = "application/octet-stream";
//Name the file
resp.AddHeader("Content-Disposition", "attachment; filename=\"" + Topic.fldName + ".rar\"");
resp.AddHeader("Content-Length", fileResp.ContentLength.ToString());
int length;
do
{
// Verify that the client is connected.
if (resp.IsClientConnected)
{
// Read data into the buffer.
length = stream.Read(buffer, 0, bytesToRead);
// and write it out to the response's output stream
resp.OutputStream.Write(buffer, 0, length);
// Flush the data
resp.Flush();
//Clear the buffer
buffer = new Byte[bytesToRead];
}
else
{
// cancel the download if client has disconnected
length = -1;
}
} while (length > 0); //Repeat until no data is read
}
finally
{
if (stream != null)
{
//Close the input stream
stream.Close();
}
}
This is my download code.
Now I want the user to get the files directly from the download server.
Do not use site traffic to download the file.
And use server download traffic
My application (written in vb.net) send data to a php script hosted on one of the free webhosting servers. The php script evaluates the data, and responds accordingly. The response from the server looks something like this:
Valid
<!-- Hosting3322 Analytics Code -->
<script type="text/javascript" src="theurlforthewebsite/count.php"></script>
<!-- End of Analytics Code -->
'Valid' is from my php script. Rest of is a little script by the server that they hide in every page.
Here is the php script:
<?php
$d = $_POST['mac'];
if($d=='45bgd0434')
echo "Valid";
else
echo "Invalid";
?>
Here is my vb.net code:
' Create a request using a URL that can receive a post.
Dim request As WebRequest = WebRequest.Create("http://sitename.com/verify.php")
' Set the Method property of the request to POST.
request.Method = "POST"
' Create POST data and convert it to a byte array.
Dim postData As String = "mac=45bgd0434"
Dim byteArray As Byte() = Encoding.UTF8.GetBytes(postData)
' Set the ContentType property of the WebRequest.
request.ContentType = "application/x-www-form-urlencoded"
' Set the ContentLength property of the WebRequest.
request.ContentLength = byteArray.Length
' Get the request stream.
Dim dataStream As Stream = request.GetRequestStream()
' Write the data to the request stream.
dataStream.Write(byteArray, 0, byteArray.Length)
' Close the Stream object.
dataStream.Close()
' Get the response.
Dim response As WebResponse = request.GetResponse()
' Get the stream containing content returned by the server.
dataStream = response.GetResponseStream()
' Open the stream using a StreamReader for easy access.
Dim reader As New StreamReader(dataStream)
' Read the content.
Dim responseFromServer As String = reader.ReadToEnd()
' Clean up the streams.
reader.Close()
dataStream.Close()
response.Close()
MessageBox.Show(responseFromServer)
I would just like to have only the output and not that extra code. Is there any way I can use an alternative method to print in PHP, or probably another method with which I can talk to the server?
I have tried other free servers on the internet, but they all seem to put in some code. Would really appreciate your help.
I have a vb.net application where i am sending error string to a php page to process it.
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim errorString As String = "test string"
Dim request As WebRequest = WebRequest.Create("http://10.0.0.1/test.php")
request.Method = "POST"
Dim byteArray As Byte() = Encoding.UTF8.GetBytes(errorString)
request.ContentType = "application/x-www-form-urlencoded"
request.ContentLength = byteArray.Length
Dim dataStream As Stream = request.GetRequestStream()
dataStream.Write(byteArray, 0, byteArray.Length)
dataStream.Close()
Dim response As WebResponse = request.GetResponse()
dataStream = response.GetResponseStream()
Dim reader As New StreamReader(dataStream)
Dim responseFromServer As String = reader.ReadToEnd()
reader.Close()
dataStream.Close()
response.Close()
MsgBox(responseFromServer)
End Sub
The responseFromServer is empty. Doesn't show the errorString.
My php page for testing looks like this:
<?php
if (isset($_POST['errorString']))
{
$a = $_POST['errorString'];
echo $a;
}
else
{
echo "ERROR: No data!";
}
?>
Does anyone know what I am missing? Any help would be greatly appreciated.
Thanks in advance!
In your request string you have to add key value parameters like this,
Dim errorString As String = "errorString=test string"
This is because in php code you are using errorString as POST parameter to receive data for that key value, so always send data with respect to the POST/GET key you are using in PHP code.
I am looking to create a VBS script that can post three parameters as well as upload a file. I have a PHP file sitting on the server which is working perfectly using a form to send the parameters and file, but I want to create a script that means I don't require the form at all and could POST directly from a script.
I am really struggling to find any good / working examples... I wondered if anyone could point me in the right direction?
This is my PHP file
<?php
$parameter1 = $_GET['parameter1'];
$parameter2 = $_GET['parameter2'];
$parameter3 = $_GET['parameter3'];
$tempname = $dataname."--". date("Y_m_d--H_i_s--"). "file.txt";
$filename = '/myfiles/'. $tempname;
if (move_uploaded_file($_FILES['filechoice']['tmp_name'], $filename)) {
echo "uploaded succesfully";
} else {
echo "error uploading";
}
?>
This is the VBScript I have put together via a few sources so far....
Dim strURL
Dim HTTP
Dim dataFile
Dim dataRequest
Dim objStream
strURL = "http://localhost/uploadfile.php?parameter1=mytest1¶meter2=hello¶meter3=thankyou"
Set HTTP = CreateObject("Microsoft.XMLHTTP")
Set objStream = CreateObject("ADODB.Stream")
objStream.Type = 2
objStream.Open
objStream.LoadFromFile "c:\1234.txt"
dataFile = objStream.ReadText
dataRequest = "filechoice=" & dataFile
HTTP.open "POST", strURL, False
HTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
HTTP.setRequestHeader "Content-Length", Len(dataRequest)
WScript.Echo "Now uploading file"
HTTP.send dataRequest
WScript.Echo HTTP.responseText
Set HTTP = Nothing
I have used print_r($_GET) on the PHP file and can see the parameters are being sent perfectly....
But if I try and look for a file i.e print_r($_FILES) - it shows nothing and nothing is uploaded..
I am trying to send a document file from Lotus Script to a web server and save it there. Unfortunately the file transfer does not work. I have a Lotusscript agent to get the document and this part is working ( str_filecontent contains the correct xml file ), but the file transfer or saving is not working. Here is my Lotusscript agent:
Option Public
Option Declare
Sub Initialize
'Declare long
Dim lng_resolveTimeout, lng_connectTimeout, lng_sendTimeout, lng_receiveTimeout As Long
'Declare integer
Dim int_serverCredentials As Integer
'Declare variants
Dim var_submitObject As Variant
'Set values
int_serverCredentials = 0
lng_resolveTimeout = 120000 'miliseconds = 2 minutes
lng_connectTimeout = 1200000
lng_sendTimeout = 1200000
lng_receiveTimeout = 1200000
'Create HTTP object
Set var_submitObject = CreateObject("WinHTTP.WinHTTPRequest.5.1")
Call var_submitObject.SetTimeouts(lng_resolveTimeout, lng_connectTimeout, lng_sendTimeout, lng_receiveTimeout)
'Standards for this post
%REM
Content-Type: multipart/form-data; boundary={boundary}
{boundary}
Content-Disposition: form-data; name="data"; filename="{filename}"
Content-Type: text/plain
{contents}
{boundary}--
%END REM
Dim str_url As String
str_url = "http://.../upload.php"
Dim str_AUTH As String
Dim str_boundary As String
Dim str_filecontent As String
str_filecontent = get_data()
Dim submitHTTP
'Set post parameters
Call var_submitObject.open("POST", str_url, False)
Call var_submitObject.setRequestHeader("Accept", "application/xml")
Call var_submitObject.setRequestHeader("Authorization", "Basic " & str_auth)
Call var_submitObject.setRequestHeader("Content-Type", "multipart/form-data; boundary=b1")
str_boundary = |--b1| & Chr(13) & Chr(10) &_
|Content-Disposition: form-data; name="data"; filename="name.txt"| & Chr(13) & Chr(10) &_
|Content-Type: text/plain| & Chr(13) & Chr(10) &_
str_fileContent & |b1--|
'Send the HTTP request
Call var_submitObject.Send(str_boundary)
'Wait for the answer and set object as returned value for further validation
Call var_submitObject.WaitForResponse
Set submitHTTP = var_submitObject
'Clear memory
Set var_submitObject = Nothing
End Sub
%REM
Function get_data
Description: Comments for Function
%END REM
Function get_data() As String
Dim session As New NotesSession
Dim doc As NotesDocument
' Dim db As NotesDatabase
Dim exporter As NotesDXLExporter
' Set db = session.CurrentDatabase
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = workspace.CurrentDocument
Set doc = uidoc.Document
' Set doc = SESSION.CU
Set exporter = session.CreateDXLExporter
get_data = exporter.Export(doc)
Print get_data
End Function
Here is my web server PHP to receive and save the file:
<?php
define("UPLOAD_DIR", "/temp/");
if (!empty($_FILES["data"])) {
$myFile = $_FILES["data"];
if ($myFile["error"] !== UPLOAD_ERR_OK) {
echo "<p>An error occurred.</p>";
exit;
}
// preserve file from temporary directory
$success = move_uploaded_file($myFile["tmp_name"],
UPLOAD_DIR . $name);
if (!$success) {
echo "<p>Unable to save file.</p>";
exit;
}
// set proper permissions on the new file
chmod(UPLOAD_DIR . $name, 0644);
}
?>
Thanks for your time!