A method performed by a computer system comprising a server computer and a client computer wherein performing, by the server computer: receiving, from the client computer, a first request to establish a first HTTP connection; receiving, over the first HTTP connection, metadata for a file as part of the first request, the metadata including at least a filename, a client ID, and a file size; determining that at least a portion of the file is not stored at the server computer based on the filename; sending, to the client computer over the first HTTP connection, an indication of the at least a portion of the file to be sent by the client computer to the server computer; dynamically determining a suggested chunk size based on conditions of the server computer; sending, over the first HTTP connection, the suggested chunk size to be utilized by the client computer when sending the at least a portion of the file to the server computer; receiving, over the first HTTP connection, one or more chunks of the file, each chunk having a size less than or equal to the suggested chunk size, from the client computer, and each chunk specifying a start index of the chunk and an end index of the chunk for the chunk, wherein an appropriate chunk size is dynamically determined by the client computer based on conditions of the client computer; storing information indicating parts of the file that have been received including the start index and the end index for each of the one or more chunks received by the server computer; losing the first HTTP connection between the server computer and the client computer; receiving, from the client computer, a second request to establish a second HTTP connection; receiving, over the second HTTP connection, the metadata for the file as part of the second request; determining, based on the information stored by the server computer indicating parts of the file that have been received, a missing start index and a missing end index corresponding to a missing part of the file; determining that the file has not been completely received based on the determination of the missing start index and the missing end index; sending the missing start index and the missing end index corresponding to the missing part of the file to the client computer; receiving the missing part of the file from the client computer; and sending a confirmation that the file has been stored completely to the client computer, wherein the server computer dynamically determines the suggested chunk size and the client computer dynamically determines the appropriate chunk size based on real time conditions, whereby the suggested chunk size may be the same or different from a previously suggested chunk size, whereby the client computer dynamically determines the appropriate chunk size based on at least one of processor load, system activity, memory usage or resource utilization of the client computer. receiving, from the client computer, a first request to establish a first HTTP connection; receiving, over the first HTTP connection, metadata for a file as part of the first request, the metadata including at least a filename, a client ID, and a file size; determining that at least a portion of the file is not stored at the server computer based on the filename; sending, to the client computer over the first HTTP connection, an indication of the at least a portion of the file to be sent by the client computer to the server computer; dynamically determining a suggested chunk size based on conditions of the server computer; sending, over the first HTTP connection, the suggested chunk size to be utilized by the client computer when sending the at least a portion of the file to the server computer; receiving, over the first HTTP connection, one or more chunks of the file, each chunk having a size less than or equal to the suggested chunk size, from the client computer, and each chunk specifying a start index of the chunk and an end index of the chunk for the chunk, wherein an appropriate chunk size is dynamically determined by the client computer based on conditions of the client computer; storing information indicating parts of the file that have been received including the start index and the end index for each of the one or more chunks received by the server computer; losing the first HTTP connection between the server computer and the client computer; receiving, from the client computer, a second request to establish a second HTTP connection; receiving, over the second HTTP connection, the metadata for the file as part of the second request; determining, based on the information stored by the server computer indicating parts of the file that have been received, a missing start index and a missing end index corresponding to a missing part of the file; determining that the file has not been completely received based on the determination of the missing start index and the missing end index; sending the missing start index and the missing end index corresponding to the missing part of the file to the client computer; receiving the missing part of the file from the client computer; and sending a confirmation that the file has been stored completely to the client computer, wherein the server computer dynamically determines the suggested chunk size and the client computer dynamically determines the appropriate chunk size based on real time conditions, whereby the suggested chunk size may be the same or different from a previously suggested chunk size, whereby the client computer dynamically determines the appropriate chunk size based on at least one of processor load, system activity, memory usage or resource utilization of the client computer.