#c# #web-services #iis #upload #filestream
#c# #веб-сервисы #iis #загрузка #filestream
Вопрос:
Я использую C # для создания сервиса для загрузки файлов. Я создал три метода:
upload_start(string filename)
upload_continue(string filename, byte[] buffer)
upload_end(string filename)
Это работает, но я не хочу обрабатывать 3 функции из клиентской программы. Как я могу открыть FileStream из клиентской программы и позволить стороне сервера завершить загрузку файла?
Комментарии:
1. Вы хотите, чтобы файл был загружен с клиента, тогда сервер может начать чтение файла с клиентского компьютера? Я пытаюсь получить разъяснения по поводу того, что вы пытаетесь сделать.
2. Да, я хочу, чтобы сервер позаботился обо всем.
Ответ №1:
Вероятно, самым простым подходом было бы создать службу REST либо с помощью wcf, либо сделать что-то подобное с asp.net , но тогда вы бы просто выполнили POST
операцию, и сервер мог бы выполнить эту работу.
Вот один из подходов:
http://debugmode.net/2011/05/01/uploading-file-to-server-from-asp-net-client-using-wcf-rest-service/
У этого был бы более простой интерфейс для вас.
Ответ №2:
Я не думаю, что вы можете, поскольку FileStream не сериализуем. Почему бы не передать службе имя файла (как вы уже используете) и попросить службу открыть файл и обработать его.
Комментарии:
1. но, похоже, я могу просто запросить.getInputStream для чтения всего загружаемого файла. <br> Я не могу открыть файл по имени файла со стороны сервера веб-службы, поскольку файл находится на стороне клиента.
2. @alex — Сервер не будет иметь доступа к файловой системе на клиенте, поскольку это было бы невероятно большой дырой в безопасности, которую другие хотели бы использовать.
Ответ №3:
Для загрузки большого файла в веб-сервисах (не Windows Cominication Foundation WCF) это способ следовать:
В файле Web.Config на стороне сервера добавьте этот xml и измените значение maxRequestLength в зависимости от максимального размера загрузки, по умолчанию maxRequestLength равен 4 МБ, в этом примере 8192 = МБ
<httpRuntime
executionTimeout="600"
maxRequestLength="8192"
useFullyQualifiedRedirectUrl="false"
minFreeThreads="8"
minLocalRequestFreeThreads="4"
appRequestQueueLimit="100"
enableVersionHeader="true"
/>
Добавьте другую общедоступную функцию на стороне сервера, эта функция получила байт [], содержащий файл, имя файла и путь, по которому вы не будете сохранять файл на сервере.
public String UploadFile(byte[] fileByte, String fileName, String savePath)
{
string newPath = savePath;
if (!Directory.Exists(newPath))
{
Directory.CreateDirectory(newPath);
}
newPath = newPath fileName;
System.IO.FileStream fs1 = null;
byte[] b1 = null;
b1 = fileByte;
fs1 = new FileStream(newPath, FileMode.Create);
fs1.Write(b1, 0, b1.Length);
fs1.Flush();
fs1.Close();
fs1 = null;
return newPath;
}
На стороне клиента добавьте этот код для отправки файла:
Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
dlg.FileName = "Select a File";
dlg.DefaultExt = ".xls";
dlg.Filter = "Excel documents (.xls)|*.xls";
// Show open file dialog box
Nullable<bool> result = dlg.ShowDialog();
// Process open file dialog box results
if (result == true)
{
string filename = dlg.FileName;
string file = Path.GetFileName(filename);
System.IO.FileStream fs1 = null;
fs1 = System.IO.File.Open(filename, FileMode.Open, FileAccess.Read);
byte[] b1 = new byte[fs1.Length];
fs1.Read(b1, 0, (int)fs1.Length);
fs1.Close();
String savePath = @"C:DOCIMPORT";
String newPath = WEB_SERVICES.UploadFile(b1, file, savePath);
MessageBox.Show(String.Format("The file is uploaded in {0}", newPath));
}
else
{
MessageBox.Show("Select a file, please");
}