Классический ASP на IIS7: ошибка ADODB.Stream Файл не может быть открыт - доступ вне webroot - PullRequest
0 голосов
/ 03 декабря 2009

Я только что переустановил сервер, это новая машина, та же версия ОС (Win2008) и та же версия IIS (7.0). Приложение работало идеально (а затем машина взорвалась).

Я получаю эту ошибку при попытке получить доступ к файлу вне webroot:

Ошибка ADODB.Stream '800a0bba' Файл не может быть открыт

Я могу получить к нему доступ с помощью FileSystemObject, но не могу открыть его с помощью ADODB.Stream.

Кроме того, я могу создать PDF, используя abcPDF, но я не могу создать его снова с тем же именем и перезаписать его (это работало). Это хорошо работает внутри структуры папок сайта, но не снаружи.

Кроме того, я больше не могу прикрепить файл с помощью JMail. Это относится к файлам ОБА внутри и вне webroot. Это странно.

Я назначил Полный доступ всем пользователям на всем диске, чтобы определить, является ли это проблемой с разрешениями, и это не имеет значения.

Есть идеи у кого-нибудь?

ОБНОВЛЕНИЕ: Кажется, что проблема с вложением файлов внутри сайта больше не возникает, так как я перебрал несколько вещей. Я не уверен, что сделал это, к сожалению. Я ничего не получил по этому поводу и потерял много часов из-за этого, поэтому я переместил все файлы в корень, и теперь все работает. Это не идеально, и я все же хотел бы докопаться до сути, но обходной путь приемлем.

Обновлен вопрос, поскольку я случайно написал Win2003 вместо 2008.

Ответы [ 3 ]

1 голос
/ 06 апреля 2013

Я думаю, вам следует в первую очередь проверить из своей базы данных, как вы сохраняете рассматриваемый PDF-файл. Здесь вы сохранили файл в базу данных с того же компьютера или с удаленного компьютера. Обычно, когда вы сохраняете с того же компьютера разработчика и получаете доступ, ошибки не будет, но когда файл был сохранен с компьютера, отличного от компьютера разработчика, такая ошибка будет.

Например:

'1. dbSignatureImage = New ADODB.Stream
'2. dbSignatureImage.Type = ADODB.StreamTypeEnum.adTypeBinary
'3. dbSignatureImage.Open()
'4. dbSignatureImage.

LoadFromFile(dbRecordSet.Fields("client_signature_filename").Value)

Из приведенного выше кода я пытался отобразить два разных изображения из базы данных (по одному за раз), и среди двух изображений я сохранил одно прямо с компьютера разработчика, а другое изображение было сохранено с другого компьютера через мой сеть. Всякий раз, когда я пытаюсь отобразить второе изображение, которое было сохранено с сетевого ПК, у меня появляется ошибка файла, который не может быть открыт. Теперь я закомментировал 4-ю строку и обнаружил ошибку, но затем изображение не отображалось, поэтому я попытался отобразить само изображение непосредственно из поля BLOB, используя IO.MemoryStream со следующими кодами, и оно отлично работает как на компьютере разработчика. и любой компьютер по сети.

Dim PassportImageArray() As Byte = CType(dbRecordSet.Fields("client_passport_image").Value, Byte())
Dim SignatureImageArray() As Byte = CType(dbRecordSet.Fields("client_signature_image").Value, Byte())

Dim PassportImageMemoryStream As New MemoryStream(PassportImageArray)
Dim SignatureImageMemoryStream As New MemoryStream(SignatureImageArray)

With picSearchPhotograph
.Image = Image.FromStream(PassportImageMemoryStream)
.SizeMode = PictureBoxSizeMode.StretchImage
.BorderStyle = BorderStyle.None
End With

Я думаю, вы можете обойти свою проблему с этой моей маленькой идеей. Я надеюсь, что это будет вам как.

Kasapa-Sunyani

0 голосов
/ 09 февраля 2012

Похоже, что проблема с вложением файлов внутри сайта больше не возникает, так как я перебрал несколько вещей. Я не уверен, что сделал это, к сожалению. Я ничего не получил по этому поводу и потерял много часов из-за этого, поэтому я переместил все файлы в корень, и теперь все работает. Это не идеально, и я все же хотел бы докопаться до сути, но обходной путь приемлем.

0 голосов
/ 03 декабря 2009

Возможно, вам нужно более внимательно посмотреть на разрешения безопасности для папок за пределами домашней папки вашего приложения. Также взгляните на то, что на самом деле используется идентификатор пользователя для запуска вашего кода, например, включена ли у вас встроенная защита Windows? Если нет, верно ли это для предыдущего сервера?

Может помочь, если мы точно узнаем, действительно ли это вопрос IIS7, и в этом случае ваш сервер - это не 2003, а 2003. Вы также можете обнаружить, что подобные вещи лучше всего обрабатываются serverfault.com чел.

...